9

我的视图上有几个 UITextFields(每个都在 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 的版本来克服这个问题?

谢谢。

4

3 回答 3

12

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

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

让我知道这是否适合你。

于 2011-07-25T10:58:32.110 回答
2

而不是避免通知,您可以将 NSTimer 设置为 0.1 秒以一次性完成动画,然后取消计时器,这样如果您同时获得 UIKeyboardWillHide 和 UIKeyboardWillShow ,您将有机会取消计时器。如果两者都没有,则计时器将归零并执行动画。

于 2011-07-22T19:48:53.960 回答
1

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

于 2011-07-22T19:57:18.037 回答