Клавиатура показывает и не отключается

У меня есть представление с несколькими 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 становится первым ответчиком, и теперь все события работают как обычно.

Любые идеи относительно того, почему это происходит или как это отладить? Спасибо.


person g2guo    schedule 16.06.2014    source источник


Ответы (1)


Мне это кажется проблематичным:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                              initWithTarget:self
                              action:@selector(dismissKeyboard)];

Вместо этого вы должны попробовать сделать цель self.view:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
                              initWithTarget:self.view
                              action:@selector(dismissKeyboard)];

Если это не поможет, я бы создал пустой UIButton, который находится ниже всех других элементов пользовательского интерфейса на контроллере представления, и назначил цель UITapGestureRecognizer этой кнопке.

person T Blank    schedule 17.06.2014