UIKeyboardWillShow在第一次使用键盘时调用了两次

时间:2017-03-23 08:36:45

标签: ios swift

嘿,我有一个奇怪的问题。我在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将只调用一次。我在这做错了什么?为什么在第一次加载时会发射两次?

1 个答案:

答案 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)
 }