嘿,我有一个奇怪的问题。我在viewDidLoad
:
func registerObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
这是一个单一视图控制器测试应用程序。这些观察者未在应用程序中的任何其他位置注册。我也没有在视图控制器之间导航。 keyboardWillAppear
处理程序代码如下所示:
func keyboardWillShow(_ notification: Notification) {
guard let keyboardFrame = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
return
}
guard let keyboardAnimationDuration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber else {
return
}
guard let keyboardAnimationCurve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber else {
return
}
// Animation code
}
调用keyboardWillShow
时,它会滚动并将所选行设置为恰好位于键盘上方。
当我第一次加载应用并点击一个单元格keyboardWillShow
被调用两次时,UIKeyboardWillShow
已被触发两次。这导致我的动画出现问题,因为现在它也被调用了两次。在检查通知中的帧时,看起来第一通知中的帧不正确以使动画正常工作但第二通知框架工作。这只会在它第一次使用键盘时发生。如果我点击一个单元格并再次调用键盘keyboardWillShow
将只调用一次。我在这做错了什么?为什么在第一次加载时会发射两次?
答案 0 :(得分:3)
在关闭页面时删除通知中心。
override func viewDidDisappear(_ animated: Bool)
{
NotificationCenter.default.removeObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}