UIKeyboardWillShowNotification срабатывает два раза на iOS 8 и только один раз на iOS 7 при повороте

Из очень простого фрагмента кода ниже у меня есть странная разница в поведении между iOS 7 и 8 при вращении:

  • В iOS 7 клавиатураWillShow и клавиатураWillHide вызываются только один раз.
  • В iOS 8 клавиатураWillShow и клавиатураWillHide вызываются по два раза каждая.

Я создал очень простой проект, чтобы убедиться, что это не побочный эффект моего основного проекта, но это не так.

Это задокументированная разница в поведении?

С уважением. Себастьян.

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification
                                               object:self.view.window];


    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification
                                               object:self.view.window];
}

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

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)keyboardWillShow:(NSNotification*)notification
{
    NSLog(@"Keyboard will show.");
}

-(void)keyboardWillHide:(NSNotification*)notification
{
    NSLog(@"Keyboard will hide.");
}

@end

person Sébastien    schedule 21.06.2015    source источник
comment
Хотя это может быть внутренней ошибкой, вы должны стараться не заниматься реализацией системы клавиатуры, пока уведомления логичны (show -> hide -> show -> hide, а не hide -> show -> show -› hide). Попробуйте проверить стек вызовов, чтобы увидеть логику публикации уведомления Apple.   -  person Leo Natan    schedule 21.06.2015
comment
Поместите NSNotificationCenter в viewDidLoad и попробуйте.   -  person VRAwesome    schedule 21.06.2015
comment
Я согласен, но мое приложение должно работать на iOS 7 и iOS 8 (и 9), проблема в том, чтобы кусок кода работал правильно (при вращении устройства) как с одним, так и с двумя уведомлениями....   -  person Sébastien    schedule 21.06.2015
comment
Уже протестировано, чтобы поставить viewDidLoad, такое же поведение.   -  person Sébastien    schedule 21.06.2015


Ответы (1)


Себастьен, я думаю, вам следует добавить уведомление клавиатуры в viewDidLoad(), а затем повторить попытку, надеюсь, это вам поможет.

person Gopal Devra    schedule 22.06.2015
comment
Вы можете использовать метод cancelPreviousSelector, а затем метод executeSelector. - person Gopal Devra; 22.06.2015
comment
Вы имеете в виду добавить в методы KeyboardWillShow/KeyboardWillHide что-то вроде: [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(keyboardWillHide:) object:nil]; Такое же поведение. - person Sébastien; 22.06.2015
comment
Нет, всякий раз, когда вы хотите что-то обновить в этом методе, вызывайте его этим методом, как я рекомендовал. - person Gopal Devra; 23.06.2015