Клавиатура не закрывается после возврата из viewController в iOS 7.0

У меня есть один ViewController с пользовательским классом представления. Я обработал уведомление с клавиатуры, добавив в метод viewWillAppear и удалив уведомление в viewDidDisappear.

Добавление уведомления в viewWillAppear:

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

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector (keyboardDidHide)
                                             name: UIKeyboardDidHideNotification object:nil];

Удалить уведомление из представленияDidDisappear:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object: nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object: nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object: nil];

и вызовите метод представления из метода уведомления viewController.

Проблема:

  • После нажатия на UITextField появляется клавиатура и правильно выполняется анимация.
  • Но после появления клавиатуры, если пользователь нажмет кнопку «Назад» на панели навигации, клавиатура не будет удалена после исчезновения ViewController с экрана.
  • Теперь пользователь не может закрыть клавиатуру

Если я удалю код уведомления, тогда все сработает отлично.

До iOS 7.0 он отлично работал с кодом уведомления. Но в iOS 7.0 это не работает.

У меня есть print NSLog в каждом методе уведомления, в IOS 7.0 метод keyboardWillShow выполняется наконец, и снова появляется клавиатура. Но в iOS 6.0 клавиатура наконец не запустится.

Я также реализую методы UITextFieldDelegate.

заранее спасибо


person Punita    schedule 15.10.2013    source источник
comment
- Если я добавляю UITextField в представление ViewController, клавиатура удаляется автоматически после исчезновения ViewController. - Но если я использую пользовательский класс UIView, то клавиатура не удаляется автоматически с экрана после исчезновения ViewController. Нужна срочная помощь. Пожалуйста помогите   -  person Punita    schedule 15.10.2013
comment
Пожалуйста, покажите нам свой полный код.   -  person Akshit Zaveri    schedule 15.10.2013
comment
Предоставьте нам свои keyboardWillShow,keyboardWillHide,keyboardDidHide..   -  person Akshit Zaveri    schedule 15.10.2013


Ответы (1)


Ниже вы можете увидеть разницу в жизненном цикле клавиатуры для сохраненного (не будет освобождаться после всплывающего окна) нажатого viewController с textField/textView, который становится firstResponder.

Давайте добавим клавиатурных наблюдателей следующим образом

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

- (void) viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
}    

Жизненный цикл клавиатуры iOS6 для iPhone 5

  • ViewWillAppear:
  • [Вашетекстовое поле становится первым ответчиком]
  • клавиатураWillShow: клавиатураFrame = {0, 306, 320, 262}

  • [кнопка назад нажата]

  • клавиатураWillHide: клавиатураFrame = {320, 306, 320, 262}
  • ViewDidDisappear:

  • [нажать существующий контроллер представления]

  • ViewWillAppear:
  • клавиатураWillShow: клавиатураFrame = {0, 306, 320, 262}

Жизненный цикл клавиатуры iOS7 для iPhone 5

  • ViewWillAppear:
  • [Вашетекстовое поле становится первым ответчиком]
  • клавиатураWillShow: клавиатураFrame = {0, 308, 320, 260}

  • [кнопка назад нажата]

  • клавиатураWillHide: клавиатураFrame = {0, 568, 320, 260}
  • клавиатураDidHide:
  • клавиатураWillShow: клавиатураFrame = {0, 308, 320, 260}
  • клавиатураWillHide: клавиатураFrame = {0, 320, 320, 260}
  • ViewDidDisappear:

  • [нажать существующий контроллер представления]

  • ViewWillAppear:
  • клавиатураWillShow: клавиатураFrame = {0, 308, 320, 260}

Разница в том, что iOS7 формально пытается скрыть всплывающие окна клавиатуры, но снова показывает клавиатуру.

Таким образом, если вы хотите скрыть клавиатуру в обоих случаях, вам нужно явно отказаться от textField в viewWillDisappear. Обратите внимание, что textField.isFirstResponder равно NO в viewWillDisappear, но

[textField resignFirstResponder]; 

решает проблему.

person malex    schedule 18.12.2013
comment
Я уже реализовал перед проверкой вашего ответа, но в любом случае он работал отлично. Спасибо - person Punita; 14.06.2014