25

当键盘显示在屏幕上时,我使用下面的几行代码来获取键盘的框架。我已经注册UIKeyboardDidShowNotification通知。

func keyboardWasShown(notification: NSNotification) {
    var info = notification.userInfo
    var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).CGRectValue()
}

这曾经在 beta 5 中工作。我下载了最新的 Xcode 6 版本,即 beta 6,这个错误发生在第二行。

'[NSObject : AnyObject]?没有名为“objectForKey”的成员

经过一番谷歌搜索,我遇到了这个解决方案。我就这样改了,

var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()

但现在看来这也已经过时了。因为我现在得到这个错误。

'[NSObject : AnyObject]?没有名为“下标”的成员

我无法弄清楚这个错误或如何解决它。

4

1 回答 1

41

正如 Xcode 6 beta 6 发行说明中所提到的,大量的 Foundation API 已经过审计,以确保可选的一致性。这些更改分别替换T!T?或者T取决于值是否可以为空(或不为空)。

notification.userInfo现在是一个可选字典:

class NSNotification : NSObject, NSCopying, NSCoding {
    // ...
    var userInfo: [NSObject : AnyObject]? { get }
    // ...
}

所以你必须打开它。如果您知道userInfo不是,nil那么您可以简单地使用“强制展开”:

var info = notification.userInfo!

但请注意,如果userInfois ,这将在运行时崩溃nil

否则最好使用可选赋值:

if let info = notification.userInfo {
    var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
} else {
    // no userInfo dictionary present
}
于 2014-08-19T11:03:39.437 回答