iOS keyboardWasShown、NSNotification 和可选问题

iOS keyboardWasShown, NSNotification and Optional issue

有时我觉得自己迷失在 iOS 代码的世界里。它告诉我它没有打开它应该有一个“!”。当我修复它时,它告诉我这是错误的并删除“!”。所以我一直在循环。我一辈子都弄不明白这段代码有什么问题:

让 keyboardSize: CGSize = info.objectForKey(UIKeyboardFrameEndUserInfoKey)?.frame.size

完整代码如下:

func keyboardWasShown(notification: NSNotification) -> Void {

    let info: NSDictionary = notification.userInfo!

    let keyboardSize: CGSize = info.objectForKey(UIKeyboardFrameEndUserInfoKey)?.frame.size

    let buttonOrigin: CGPoint = self.clearAllButton.frame.origin

    let buttonHeight: CGFloat = self.clearAllButton.frame.size.height

    let visibleRect: CGRect = self.view.frame

    visibleRect.size.height -= CGFloat(keyboardSize.height) as CGFloat

    if (!CGRectContainsPoint(visibleRect, buttonOrigin)){

        let scrollPoint: CGPoint = CGPointMake(0.0, buttonOrigin.y - visibleRect.size.height + buttonHeight)

        self.scrollView.setContentOffset(scrollPoint, animated: true)

    }


}

您的 keyboardSize 常量具有 CGSize 类型和您赋予它的值 info.objectForKey(UIKeyboardFrameEndUserInfoKey)?.frame.size 可能 return nil 因此您必须将常量类型声明为 CGSize 可选 let keyboardSize: CGSize? = ...

已编辑

由于您使用键盘大小来计算可见矩形,因此您的完整代码应如下所示

func keyboardWasShown(notification: NSNotification) -> Void {

let info: NSDictionary = notification.userInfo!

if let keyboardSize: CGSize = info.objectForKey(UIKeyboardFrameEndUserInfoKey)?.frame.size {

    let buttonOrigin: CGPoint = self.clearAllButton.frame.origin

    let buttonHeight: CGFloat = self.clearAllButton.frame.size.height

    let visibleRect: CGRect = self.view.frame

    visibleRect.size.height -= CGFloat(keyboardSize.height) as CGFloat

    if (!CGRectContainsPoint(visibleRect, buttonOrigin)){

        let scrollPoint: CGPoint = CGPointMake(0.0, buttonOrigin.y - visibleRect.size.height + buttonHeight)

        self.scrollView.setContentOffset(scrollPoint, animated: true)

    }

    }

}