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)
}
}
}
有时我觉得自己迷失在 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)
}
}
}