UIKeyboardDidShow是否经常触发?

时间:2018-06-17 17:55:59

标签: ios swift keyboard first-responder inputaccessoryview

为了在用户的键盘正上方显示文本字段,我在自定义视图控制器中覆盖了inputAccessoryView
我还确保视图控制器可以通过覆盖canBecomeFirstResponder(并返回true)并通过调用self.becomeFirstResponder()中的viewWillAppear()来成为第一个响应者。

现在,当我在视图控制器中显示一些消息UICollectionViewCells时,我想在键盘出现时向下滚动。所以我在viewDidLoad()添加了通知:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: Notification.Name.UIKeyboardDidShow, object: nil)

keyboardDidShow()然后调用滚动功能:

@objc private final func scrollToLastMessage() {
    // ('messages' holds all messages, one cell represents a message.)
    guard messages.count > 0 else { return }
    let indexPath = IndexPath(item: self.messages.count - 1, section: 0)
    self.collectionView?.scrollToItem(at: indexPath, at: .bottom, animated: true)
}

实际上,通过在Xcode中设置断点,我发现键盘出现后会触发该函数。但另外,它也在我辞职第一个响应者之后触发(f.ex.通过点击返回键[我辞去第一个响应者并在textFieldShouldReturn中返回])并且键盘消失了。虽然我认为它不应该:正如Apple博士说的那样:

  

在显示键盘后立即发布。

通知也会在访问视图控制器时触发,因此在主视图出现后和单击(自定义)UICollectionViewCell时(单元格没有任何可编辑内容,只有静态标签或图像视图,所以键盘甚至不应该出现。

提供更多信息:我几乎在Youtube上遵循了本教程:https://www.youtube.com/watch?v=ky7YRh01by8

1 个答案:

答案 0 :(得分:2)

UIKeyboardDidShow通知可能会比您预期的更频繁地发布,而不仅仅是最初出现时。例如,当框架在可见之后发生更改时,会发布UIKeyboardDidShow

但是,通过从userInfo字典中检查键盘的结束帧,您可以知道键盘是否真正可见。这将告诉您屏幕上的大小和位置,然后您可以使用它来确定在用户界面中的最佳反应。