在keyboardWillShow通知中从Swift 2转换为3时可选的错误

时间:2017-03-29 16:11:55

标签: ios swift keyboard

我正在将我的应用程序转换为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()
                })
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

这是我建议强行展开的极少数情况之一。您知道 userInfo包含此信息,如果它没有,您就会被清除。而且,不需要通过AnyObject或调用cgRectValue;你可以一举一动地投射到CGRect。所以我会写:

    let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! CGRect).size.height

(请注意,没有if,因为我们没有进行条件绑定;我们只是演员,kaboom。)

[另请注意,现在无需提取duration或致电animatelayoutIfNeeded;你可以扔掉所有这些。我们已经在动画中,您对contentInsetscrollIndicatorInsets的更改会在键盘上及时生成动画。]

答案 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>都可以使用。