iOS版本之间的UIKeyboardWillShowNotification、UIKeyboardWillHideNotification和NSNotificationCenter问题

Posted

技术标签:

【中文标题】iOS版本之间的UIKeyboardWillShowNotification、UIKeyboardWillHideNotification和NSNotificationCenter问题【英文标题】:UIKeyboardWillShowNotification, UIKeyboardWillHideNotification and NSNotificationCenter problem between iOS versions 【发布时间】:2011-07-22 19:36:27 【问题描述】:

我的视图上有几个 UITextField(每个都在一个 UITableViewCell 中)。当键盘从任何文本字段中触发时,我需要制作一些动画,主要是为了改变 UITableView 的框架。键盘隐藏时也必须如此。

我已经完成了动画,所以这不是这里的问题。

现在,我使用 NSNotificationCenter 来捕捉键盘的显示/隐藏:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil];

问题是当键盘可见(使用文本字段)并且我在另一个文本字段中按下时。通常这个东西键盘不会隐藏,但会保持可见。

它在 ios 4 中运行良好,但问题出现在 3.1.3 中(这是我可以测试的版本 - 可能是 3.2 以下的任何版本)。在早于 3.2 的版本中,将焦点从一个文本字段直接更改为另一个文本字段将触发 UIKeyboardWillHideNotification 和 UIKeyboardWillShowNotification。

在没有 NSNotificationCenter 的情况下,任何人都知道在键盘真正显示/隐藏时执行某些动画的方法吗?

或者我该如何解决低于 3.2 的版本的这个问题?

谢谢。

【问题讨论】:

一个注意事项:几乎每个人都升级到了 iOS 4 以及那些很少下载或更新应用程序的人。一种替代方法是切换到仅支持新版本的 iOS 4。如果您的应用程序与银行应用程序同等重要,或者您有一些非常特殊的需要,请仅支持这两种应用程序。 @Peter:同意你的看法。只是应用程序几乎完成了。这个小问题并不是我只支持 iOS4 设备的真正原因。 【参考方案1】:

你可以做的是将文本字段/文本视图的委托设置为当前视图控制器并实现这两种方法

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

    _keyboardWillHide = NO;
    return YES;


- (BOOL)textViewShouldBeginEditing:(UITextView *)textView

    _keyboardWillHide = NO;
    return YES;    

在您的方法中,在UIKeyboardWillHideNotification 通知触发之后,您可以执行类似的操作

if (_keyboardWillHide) 
    // No other textfield/textview was selected so you can animate the tableView
    ...

_keyBoardWillHide = YES;

让我知道这是否适合你。

【讨论】:

谢谢,我今晚试试,然后回复你。 它有效,但有一些小的变化:在你的回答中 _keyBoardWillHide = YES;在 UIKeyboardWillHideNotification 中。我把它移到我有 [UITextField resignFirstResponder] 的任何地方; @shim 一个用于UITextField,另一个用于UITextView【参考方案2】:

除了避免通知之外,您可以将 NSTimer 设置为 0.1 秒以在一个中执行动画,在另一个中取消计时器,这样如果您同时获得 UIKeyboardWillHide 和 UIKeyboardWillShow ,您将获得一个取消计时器的机会。如果两者都没有,则计时器将归零并执行动画。

【讨论】:

这是个好主意。但不能这样做,因为这会在 UIKeyboard 的动画和我自己的动画之间产生一个小的差距(延迟)。 通知是否总是以可预测的顺序触发? 你可以考虑在 WillHide 方法中启动动画,然后在 WillShow 方法中检查动画是否启动,并中断它。这样,如果没有表演,他们就会被执行,否则他们会在任何事情发生之前就被阻止。假设这两种方法都被快速调用,即【参考方案3】:

考虑使用UITextFieldDelegate 协议。方法textFieldShouldBeginEditing: 将在通知之前触发,并且每次您进入文本字段时都会触发。

【讨论】:

以上是关于iOS版本之间的UIKeyboardWillShowNotification、UIKeyboardWillHideNotification和NSNotificationCenter问题的主要内容,如果未能解决你的问题,请参考以下文章

CBCentralManagerState(iOS 5.x 到 9.x)和 CBManagerState(iOS 10.x 或更高版本)之间的 CoreBluetooth 兼容性问题 [重复]

刺激战场手游ios版本和安卓版本能互通吗?

在 NSDocument 和 UIDocument 之间共享代码

iOS降级教程

检测 iOS 版本

iOS 和 Windows 之间的 MultipeerConnectivity