У меня есть представление с несколькими UITextfields, когда я быстро нажимаю и случайным образом печатаю в UITextFields, через некоторое время я вхожу в состояние, в котором клавиатура отображается, но не закрывается. Нажатие правой нижней кнопки «Отключить клавиатуру» не работает. Все клавиши на клавиатуре по-прежнему издают щелкающий звук и при нажатии становятся серыми.
В контроллере корневого представления я наблюдаю за всеми событиями скрытия и отображения клавиатуры.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShowWithNotification:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHideWithNotification:)
name:UIKeyboardDidHideNotification object:nil];
- (void)keyboardDidShowWithNotification:(NSNotification *)aNotification
{
DataViewController* theCurrentController = (DataViewController*)self.pageViewController.viewControllers[0];
float yCoord;
UITextField* text = (UITextField*)[self findFirstResponder:theCurrentController.view];
if(text.frame.origin.y < 10)
yCoord = text.superview.frame.origin.y;
else
yCoord = text.frame.origin.y;
NSLog(@"%f",yCoord);
if(yCoord > 410)
offCenter = 230;
else if (yCoord > 240)
offCenter = 150;
if(offCenter > 0)
[UIView animateWithDuration:0.3
delay:0 options:UIViewAnimationCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState
animations:^{
CGPoint adjust = CGPointMake(0, -1*offCenter);
CGPoint newCenter = CGPointMake(self.pageViewController.view.center.x+adjust.x, self.pageViewController.view.center.y+adjust.y);
[self.pageViewController.view setCenter:newCenter];
}
completion:nil];
}
- (void)keyboardDidHideWithNotification:(NSNotification *)aNotification
{
if(offCenter)
{
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState
animations:^{
CGPoint adjust = CGPointMake(0, offCenter);
CGPoint newCenter = CGPointMake(self.pageViewController.view.center.x+adjust.x, self.pageViewController.view.center.y+adjust.y);
[self.pageViewController.view setCenter:newCenter];
}
completion:nil];
}
offCenter = 0;
}
Когда отображается клавиатура, если первый ответчик скрыт клавиатурой, я анимирую представление, чтобы пользователь мог видеть UITextField. Когда клавиатура скрывается, если вид расположен высоко, он возвращается в центр.
В самом ViewController реализуйте UITapGestureRecognizer
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)];
-(void)dismissKeyboard {
[self.heartRateTextField resignFirstResponder];
[self.systolicBPTextField resignFirstResponder];
[self.diastolicBPTextField resignFirstResponder];
}
когда происходит касание, я resignFirstResponder для всех UITextFields.
ViewController также является UITextFieldDelegate, реализующим следующие
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered {
if(([textEntered intValue] && textField.text.length < 3) || [textEntered isEqualToString:@""] || ([textEntered isEqualToString:@"0"] && textField.text.length > 0 && textField.text.length < 3))
return YES;
else
return NO;
}
Точки останова в этих двух обработчиках событий не срабатывают, хотя кнопка возврата и все остальные клавиши на клавиатуре все еще активны. Я могу коснуться их, и они синхронизируются и становятся серыми.
Все это работает, когда представление не находится в этом состоянии ошибки. Только после случайного нажатия и набора текста представление перестает отвечать, и ни одно из этих событий не запускается. Это состояние ошибки возникает только на страницах, на которых поле UITextField скрыто клавиатурой и требуется анимация. Это состояние ошибки возникает только тогда, когда вид центрирован, а не высоко. Это состояние ошибки возникает только при нажатии между UITextFields, которые находятся ниже скрытой строки клавиатуры и выше скрытой строки клавиатуры.
Чтобы выйти из состояния ошибки, вы просто нажимаете на видимое поле UITextField. UITextField становится первым ответчиком, и теперь все события работают как обычно.
Любые идеи относительно того, почему это происходит или как это отладить? Спасибо.