Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在键盘上从Swift 2转换为Swift 3时出现可选错误将显示通知_Ios_Swift_Keyboard - Fatal编程技术网

Ios 在键盘上从Swift 2转换为Swift 3时出现可选错误将显示通知

Ios 在键盘上从Swift 2转换为Swift 3时出现可选错误将显示通知,ios,swift,keyboard,Ios,Swift,Keyboard,我现在正在将我的应用程序转换为Swift 3,我以前用来显示键盘的功能有问题 条件绑定的初始值设定项必须具有可选类型,而不是“CGFloat” 错误出现在第三行 我上次编程已经有一段时间了,所以我不知道如何解决这个问题 func keyboardWillShow(_ sender: Notification) { if let userInfo = sender.userInfo { if let keyboardHeight = (userInfo[UI

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

这是我建议强制展开的罕见情况之一。您知道
userInfo
包含此信息,如果不包含此信息,您将被套住。此外,不需要通过任何对象或调用
cgRectValue
;你可以在一次移动中一直投射到CGRect。所以我会写:

    let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! CGRect).size.height
(请注意,如果,则不存在
,因为我们没有执行条件绑定;我们只是强制转换,kaboom。)


[请注意,现在无需获取
持续时间
,也无需调用
动画
布局
;您可以将所有这些都扔掉。我们已经在制作动画,您对
内容插入集
滚动指示器集
的更改将及时在键盘上设置动画。]

这是我建议强制展开的罕见情况之一。您知道
userInfo
包含此信息,如果不包含此信息,您将被套住。此外,不需要通过任何对象或调用
cgRectValue
;你可以在一次移动中一直投射到CGRect。所以我会写:

    let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! CGRect).size.height
(请注意,如果
,则不存在
,因为我们没有执行条件绑定;我们只是强制转换,kaboom。)

[请注意,现在无需获取
持续时间
,也无需调用
动画
布局
;您可以将所有这些都扔掉。我们已经在制作动画,您对
内容插入集
滚动指示器集
的更改将及时在键盘上设置动画。]改变

if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.size.height {

---更新---

AnyObject?
之所以有效,是因为
AnyObject
可以包含
Optional
本身。因此,必须显式地强制转换为可选。无论是
AnyObject?
还是
Optional
都可以使用。

更改

if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.size.height {

---更新---

AnyObject?
之所以有效,是因为
AnyObject
可以包含
Optional
本身。因此,必须显式地强制转换为可选。
AnyObject?
Optional
都可以工作