Уведомления клавиатуры iOS запускаются без необходимости при отображении предупреждений на iOS8.3

Мы наблюдаем необычное поведение в отношении того, что клавиатура будет показывать и скрывать уведомления на iOS 8.3.

Контроллер просмотра (прослушивающий уведомления клавиатуры) имеет текстовое поле, и при нажатии и нажатии кнопки отправки метод сначала удаляет первого ответчика из текстового поля и показывает предупреждение, чтобы сообщить предупреждение. Все работает нормально, клавиатура отключается и появляется оповещение, как и ожидалось. (также вызывает метод UIKeyboardWillHideNotification).

Однако в версии 8.3, после нажатия OK/Отмена делегата Alertview, он отклоняет предупреждение и вызывает UIKeyboardWillShowNotification и UIKeyboardWillHideNotification соответственно, хотя это не должно было вызываться! Этого не ожидалось, так как клавиатура уже была убрана до отображения предупреждения!

Here is the code snippet, that we are trying:

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

    }

- (IBAction)ShowAlert:(id)sender {

    [self.TxtField resignFirstResponder];

     //This woudln't make any diff either :(
    [self.view endEditing:YES];

          [self ShowAlertForTest];

}


-(void)ShowAlertForTest{

    UIAlertView *theAlertView= [[UIAlertView alloc]initWithTitle:@"Title"

                                                         message:@"msg"

                                                        delegate:self

                                               cancelButtonTitle:@"Cancel"

                                               otherButtonTitles:@"Yes", nil];

   [theAlertView show];

}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
     NSLog(@"buttonIndex = %ld",buttonIndex);
}

- (void)keyboardWillShow:(NSNotification *)aNotification
{
    NSLog(@"keyboardWillShow");
}


- (void)keyboardWillHide:(NSNotification *)aNotification
{
    NSLog(@"keyboardWillHide");
}

Это поведение вызывает проблемы в нашем приложении, когда из предыдущего делегата alertview запускаются каскадные оповещения, вызывающие клавиатуру в ненужных ситуациях.

Любая помощь/совет приветствуется!


person My3    schedule 20.05.2015    source источник
comment
Вам нужна поддержка более ранних версий, чем 8? В противном случае UIAlertView устарел, и вы можете добиться большего успеха с UIAlertController.   -  person Yaser    schedule 20.05.2015
comment
Да @Yaser, мы тоже поддерживаем iOS7!   -  person My3    schedule 21.05.2015


Ответы (4)


В нашем случае клавиатура была скрыта приложением вручную (например, когда пользователь нажимает «Войти», мы скрываем клавиатуру и вызываем API входа на сервер). В случае сбоя приложение представляет UIAlertView сообщение об ошибке. Когда пользователь закрывает оповещение, сообщения iOS будут/спрятаны и будут/показаны уведомления. Конечно, клавиатура не отображается и не скрывается во время этой последовательности, потому что она уже скрыта приложением.

Однако мы заметили, что проблема решается не скрытием клавиатуры вручную, а предоставлением iOS сделать это за нас. Итак, клавиатура скрывается автоматически в двух случаях:

  1. когда отображается UIAlertView
  2. когда контроллер представления освобождается

Примечание. клавиатура автоматически отображается при закрытии UIAlertView.

person Yevhen Dubinin    schedule 22.09.2015

Моя команда обошла это, просто отписавшись от уведомлений с клавиатуры перед представлением представления предупреждений и повторно подписавшись на эти уведомления после того, как представление предупреждений было отклонено. Не идеально, но это решило проблему для нас.

person Stunner    schedule 24.06.2015

В моем случае пользователь нажимает кнопку входа, затем я звоню;

[self.view endEditing: YES];
//server request here and in completion/fail alert.

Клавиатура была закрыта, оповещение отображается хорошо, но при отмене / применении клика клавиатура снова отображалась и исчезала. Но проблема заключалась в том, что это происходило иногда, если запрос сервера требует времени, проблема не наблюдается, если оповещение отображается немедленно, проблема все еще существует. Поэтому я решил вызывать свои оповещения с задержкой. Постановка задержки на оповещение решила мою проблему. Надеюсь это поможет.

person Nazire Aslan    schedule 06.10.2015

Я только что исправил аналогичную проблему. Клавиатура продолжает всплывать после закрытия предупреждения. Это похоже на ошибку Apple. Я рекомендую вам использовать UIAlertController вместо UIAlertView. Это позволит избежать многих потенциальных проблем. Есть простое решение: если вы используете UIAlertController, вы можете просто установить для анимации значение NO.

[self presentViewController:alert animated:NO completion:nil];

Дайте мне знать, если это решило вашу проблему

person Yifan Fan    schedule 29.09.2016