UIKeyboardWillShowNotification, UIKeyboardWillHideNotification и NSNotificationCenter проблема между версиями iOS - PullRequest
9 голосов
/ 22 июля 2011

У меня есть несколько 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?

Спасибо.

Ответы [ 3 ]

12 голосов
/ 25 июля 2011

Что вы можете сделать, это установить делегата текстового поля / textview для текущего контроллера представления и реализовать эти 2 метода

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

Дайте мне знать, если это работает для вас.

2 голосов
/ 22 июля 2011

Вместо того, чтобы избегать уведомлений, вы можете установить NSTimer на 0,1 секунды, чтобы анимации выполнялись в одном, а в другом - отменить таймер. Таким образом, если вы одновременно получаете UIKeyboardWillHide и UIKeyboardWillShow, вы получите шанс отменить таймер. Если вы не получите оба, таймер достигнет нуля, и анимация будет выполнена.

1 голос
/ 22 июля 2011

Рассмотрите возможность использования протокола UITextFieldDelegate. Метод textFieldShouldBeginEditing: срабатывает перед уведомлением и выключается при каждом входе в текстовое поле.

...