iOS keyboardWasShown,NSNotification和Optional问题

时间:2015-02-12 17:04:22

标签: ios swift keyboard nsnotification

有时我在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)

    }


}

1 个答案:

答案 0 :(得分:1)

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

EDITED

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

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)

    }

    }

}