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

时间:2011-07-22 19:36:28

标签: iphone objective-c ios4 uikeyboard ios-3.x

我的视图中有几个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的版本克服此问题?

感谢。

3 个答案:

答案 0 :(得分:12)

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

- (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;

请告诉我这是否适合您。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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