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

Iphone iOS版本之间的UIKeyboardWillShowNotification、UIKeyboardWillHideNotification和NSNotificationCenter问题,iphone,objective-c,ios4,uikeyboard,ios-3.x,Iphone,Objective C,Ios4,Uikeyboard,Ios 3.x,我的视图中有几个UITextField(每个都在UITableViewCell中)。当从任何文本字段触发键盘时,我需要制作一些动画,主要是更改UITableView的帧。当键盘隐藏时,也必须发生同样的情况 我已经做了动画,所以这不是这里的问题 现在,我使用NSNotificationCenter捕捉键盘的显示/隐藏: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow

我的视图中有几个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的版本,我如何克服这个问题


谢谢。

您可以将NSTimer设置为0.1秒,以在其中一个中执行动画,而在另一个中取消计时器,这样,如果您同时获得UIKeyboardWillHide和UIKeyboardWillShow,您将有机会取消计时器。如果两者都没有得到,计时器将达到零,动画将被执行。

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

您可以做的是将textfield/textview的委托设置为当前视图控制器,并实现这两种方法

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    _keyboardWillHide = NO;
    return YES;
}

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
    _keyboardWillHide = NO;
    return YES;    
}
在您的方法中,get由
UIKeyboardWillHideNotification
通知触发后,您可以执行以下操作

if (_keyboardWillHide) {
    // No other textfield/textview was selected so you can animate the tableView
    ...
}
_keyBoardWillHide = YES;

让我知道这是否适合你。

考虑:几乎每个人都升级到了iOS 4,而那些很少下载或更新应用的人。另一种选择是切换到仅支持iOS 4的新版本。如果你的应用程序与银行应用程序相当重要,或者如果你有一些特别的需要这么做的话,那就麻烦你。“彼得:同意你的意见。只是应用程序几乎完成了。这个小问题并不是我只支持iOS4设备的真正原因。这是个好主意。但是不能做到这一点,因为这会在uiBook的动画和我自己的动画之间创建一个小的间隙(延迟)。通知总是以可预测的顺序开火吗?你可以考虑在WelEdk方法中启动动画,然后在WelSee方法中检查动画是否启动,然后中断它。这样,如果没有演出,他们将被执行,否则他们将在任何事情发生之前被阻止。假设这两种方法都被称为“快攻”(rapid fire),我今晚会试试,然后再给你回复。虽然有效,但有一些小变化:在你的回答中_keyBoardWillHide=YES;在UIKeyboardWillHideNotification中。我把它移到了我所有的地方[UITextField辞职firstresponder]@垫片一个用于
UITextField
,另一个用于
UITextView