Клавиатурата няма да се затвори след връщане от viewController в iOS 7.0

Имам един ViewController с персонализиран клас на изглед. Обработих известието от клавиатурата, като добавих към метода viewWillAppear и премахнах известието във viewDidDisappear.

Добавянето на известие в изгледа ще се появи:

[[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];

Премахване на известието във viewDidDisappear:

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

и извикайте метода на view от метода за уведомяване на viewController.

Проблем:

  • След като докоснете UITextField, клавиатурата се появява и правилно анимацията е готова
  • Но след като се появи клавиатурата, ако потребителят натисне бутона за връщане назад от лентата за навигация, клавиатурата няма да се премахне, след като ViewController изчезне от екрана.
  • Сега потребителят не може да затвори клавиатурата

Ако премахна кода за известяване, тогава работи перфектно.

Преди iOS 7.0 работи перфектно с кода за уведомяване. Но в iOS 7.0 не работи.

Имам печат на NSLog във всеки метод за уведомяване, в IOS 7.0 методът keyboardWillShow се изпълнява най-накрая и отново се появява клавиатура. Но в iOS 6.0 keyboardWillShow най-накрая не се изпълнява.

Също така прилагам 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:
  • [YourTextField becomeFirstResponder]
  • keyboardWillShow: keyboardFrame = {0, 306, 320, 262}

  • [натиснат бутон за връщане]

  • keyboardWillHide: keyboardFrame = {320, 306, 320, 262}
  • viewDidDisappear:

  • [избутване на съществуващ контролер за изглед]

  • viewWillAppear:
  • keyboardWillShow: keyboardFrame = {0, 306, 320, 262}

Жизнен цикъл на клавиатурата iOS7 за iPhone 5

  • viewWillAppear:
  • [YourTextField becomeFirstResponder]
  • keyboardWillShow: keyboardFrame = {0, 308, 320, 260}

  • [натиснат бутон за връщане]

  • keyboardWillHide: keyboardFrame = {0, 568, 320, 260}
  • keyboardDidHide:
  • keyboardWillShow: keyboardFrame = {0, 308, 320, 260}
  • keyboardWillHide: keyboardFrame = {0, 320, 320, 260}
  • viewDidDisappear:

  • [избутване на съществуващ контролер за изглед]

  • viewWillAppear:
  • keyboardWillShow: keyboardFrame = {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