UIKeyboardWillShowNotification, UIKeyboardWillHideNotification и NSNotificationCenter проблема между версиями iOS
У меня есть несколько 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 ответа
Что вы можете сделать, это установить делегат текстового поля /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;
Дайте мне знать, если это работает для вас.
Вместо того, чтобы избегать уведомлений, вы можете установить NSTimer на 0,1 секунды, чтобы анимации выполнялись в одном, а в другом - отменить таймер. Таким образом, если вы одновременно получаете UIKeyboardWillHide и UIKeyboardWillShow, вы получите возможность отменить таймер Если вы не получите оба, таймер достигнет нуля, и анимация будет выполнена.
Рассмотрите возможность использования UITextFieldDelegate
протокол. Метод textFieldShouldBeginEditing
: сработает до уведомления и будет срабатывать при каждом входе в текстовое поле.