当我尝试处理键盘通知时,我的应用程序崩溃了。我使用的是xCode 6.0,项目是在Swift中。
尝试隔离问题我创建了一个新的应用程序,该应用程序仅包含UITextView
和4个约束,这些约束将视图固定到顶部,左侧和右侧边缘并设置固定高度。
我的ViewController
所拥有的全部内容如下:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.observeKeyboard()
}
override func viewDidDisappear(animated: Bool) {
NSNotificationCenter().removeObserver(self)
}
func observeKeyboard() {
NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector(keyboardWillAppear()), name:UIKeyboardWillChangeFrameNotification, object:nil)
}
func keyboardWillAppear() {
println("keyboardWillAppear")
}
}
当我在模拟器中启动应用程序时,
keyboardWillAppear
打印到控制台,当我点击文本视图时,应用程序崩溃:
EXC_BAD_ACCESS code=1:
错误:memory read failed for 0x0
显示键盘,但另一个keyBoardWillAppear
未打印到控制台。
此应用程序中没有其他内容,只有上面的代码和4个约束。我刚刚开设了一个全新的项目,试图找出我在其他应用程序中遇到的问题。我还尝试订阅viewDidAppear
中的通知,我还尝试了其他通知UIKeyboardWillShowNotification
和UIKeyboardDidShowNotification
,但结果始终相同。
我错过了什么?感谢您的帮助!
答案 0 :(得分:1)
您正在使用函数keyboardWillAppear()
的返回来制作选择器。尝试使用字符串:Selector("keyboardWillAppear:")
。
另外还有一个注意事项:您正在viewDidLoad
中注册键盘通知,通常每个视图控制器生命周期只调用一次。最好在viewWillAppear:
注册这些通知。
答案 1 :(得分:1)
第一个解决方案是在撞到墙上之前睡觉。
早上我发现了我的问题。我做错了是用错误的选择器注册通知。有一个参数传递给通知处理程序,因此选择器应该是:selector:"keyboardWillAppear:"
,带冒号,指定这是一个带参数的函数。
所以而不是:
NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector(keyboardWillAppear()), name:UIKeyboardWillChangeFrameNotification, object:nil)
我应该使用:
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillAppear:", name: UIKeyboardWillChangeFrameNotification, object: nil)
感谢所有试图提供帮助的人,我希望这将有助于其他新手Swift。