更新到 Xcode 8 beta 6 后,出现以下错误:
Value of type 'Any' has no member 'cgRectValue'
在以下 block 上:
var tmpContentViewFrameOrigin: CGPoint?
var tmpCircleViewFrameOrigin: CGPoint?
var keyboardHasBeenShown:Bool = false
func keyboardWillShow(_ notification: Notification) {
keyboardHasBeenShown = true
if let userInfo = (notification as NSNotification).userInfo {
if let beginKeyBoardFrame = userInfo[UIKeyboardFrameBeginUserInfoKey]!.cgRectValue.origin.y {
if let endKeyBoardFrame = userInfo[UIKeyboardFrameEndUserInfoKey]?.cgRectValue.origin.y {
tmpContentViewFrameOrigin = self.contentView.frame.origin
tmpCircleViewFrameOrigin = self.circleBG.frame.origin
let newContentViewFrameY = beginKeyBoardFrame - endKeyBoardFrame - self.contentView.frame.origin.y
let newBallViewFrameY = self.circleBG.frame.origin.y - newContentViewFrameY
self.contentView.frame.origin.y -= newContentViewFrameY
self.circleBG.frame.origin.y = newBallViewFrameY
}
}
}
}
特别是这两行:
if let beginKeyBoardFrame = userInfo[UIKeyboardFrameBeginUserInfoKey]!.cgRectValue.origin.y {
if let endKeyBoardFrame = userInfo[UIKeyboardFrameEndUserInfoKey]?.cgRectValue.origin.y {
我可能遗漏了一些非常简单的东西……有什么建议吗?
最佳答案
cgRectValue
是 NSValue
类的一个属性。您从 userInfo
字典中得到的内容不知道是 NSValue
,因此您无法访问它的 NSValue
属性。
为了让编译器允许您使用这些属性,您需要让它知道您希望该值是一个 NSValue
:
if let beginKeyBoardFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.origin.y {
(这之前不会导致编译器错误,因为导入的 Cocoa API 中的字典与 AnyObject
的值类型桥接。AnyObject
有一些像 ObjC id
类型,因为编译器会让你调用它的任何方法/属性——结果包装在 Optional
中,因为它可能不存在。现在字典有 Any
作为它们的值类型,您需要明确说明您期望值类型是什么。)
关于ios - Xcode 8 beta 6 中的模糊错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001688/