我正在将我的应用程序转换为Swift 3,我之前使用此功能时遇到了问题。
条件绑定的初始化程序必须具有可选类型,而不是'CGFloat'
错误出现在第三行。
自从我上次编程以来已经有一段时间了,所以我不知道如何解决这个问题。
func keyboardWillShow(_ sender: Notification) {
if let userInfo = sender.userInfo {
if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.size.height {
let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as AnyObject).doubleValue
let edgeInsets = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
UIView.animate(withDuration: duration!, animations: { () -> Void in
self.tableView.contentInset = edgeInsets
self.tableView.scrollIndicatorInsets = edgeInsets
self.view.layoutIfNeeded()
})
}
}
}
答案 0 :(得分:3)
这是我建议强行展开的极少数情况之一。您知道 userInfo
包含此信息,如果它没有,您就会被清除。而且,不需要通过AnyObject或调用cgRectValue
;你可以一举一动地投射到CGRect。所以我会写:
let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! CGRect).size.height
(请注意,没有if
,因为我们没有进行条件绑定;我们只是演员,kaboom。)
[另请注意,现在无需提取duration
或致电animate
或layoutIfNeeded
;你可以扔掉所有这些。我们已经在动画中,您对contentInset
和scrollIndicatorInsets
的更改会在键盘上及时生成动画。]
答案 1 :(得分:0)
更改
if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.size.height {
到
if let foo = userInfo[UIKeyboardFrameEndUserInfoKey] {
let keyboardHeight = (foo as as AnyObject).cgRectValue.size.height
---更新---
或
if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject?).cgRectValue.size.height {
AnyObject?
有效,因为AnyObject
本身可以包含Optional
。所以你必须明确地转换为Optional。 AnyObject?
或Optional<AnyObject>
都可以使用。