2013-10-24 2 views
1

Я получаю несколько уведомлений UIKeyboardDidShowNotification и UIKeyboardDidHideNotification при повороте устройства, и я не могу понять, почему.Несколько NSNotifications при повороте экрана

У меня есть приложение, которое позволяет редактировать текст для каждого изображения. (Это в UITextView.) В большинстве случаев мне нужно сдвигать текст, чтобы вы могли видеть его выше клавиатуры, а затем я сдвигаю его, когда вы закончите редактирование. Затем я обновляю базу данных, чтобы сохранить новый текст. Я использую уведомления, чтобы сказать мне, когда клавиатура отображается и когда она уходит. Он отлично работает на iPad, когда пользователь нажимает значок клавиатуры на клавиатуре. Он также отлично работает, если пользователь перебирается на следующую страницу, а iOS закрывает клавиатуру. Поскольку у iPhone и iPod нет клавиши закрытия клавиатуры, я написал метод закрытия клавиатуры при прослушивании изображения или фона. Там хорошо работает. Однако, когда я поворачиваю устройство, я получаю несколько уведомлений о скрытии и показе. И я не знаю, почему.

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

2:39:44.200 Picts for SLPs[16533:907] keyboardDidHide called. Keyboard showing flag is YES. 
2:39:51.751 Picts for SLPs[16533:907] keyboardDidShow called. Keyboard showing flag is NO. 
2:39:55.224 Picts for SLPs[16533:907] keyboardDidHide called. Keyboard showing flag is YES. 
2:39:56.124 Picts for SLPs[16533:907] keyboardDidShow called. Keyboard showing flag is NO. 

Я разместил соответствующий код ниже. Это берется в основном из сообщений StackOverflow (спасибо, ребята).

В моем классе, который отображает фотографии, я запускаю уведомления, когда они инициализируются.

- (id)initWithParentView:(UIView *)parentview { 

    self = [super init]; 
    if (self) { 
     _parentView = parentview; 
     if (ALLOW_DATABASE_EDITING) [self startNotifications]; 
    } 

    return self; 
} 

- (void)startNotifications { 

    // Listen for keyboard appearances and disappearances 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShow:) 
               name:UIKeyboardDidShowNotification 
               object:nil]; 

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

Контроллер вида вызывает метод hideKeyboard в представлении, когда пользователь нажимает на изображение.

- (void)dismissKeyboard { 

    if (self.showArtic.keyBoardIsShowing) { 
     [self.showArtic hideTheKeyboard]; 
    } 
} 

resignFirstResponder отправляет уведомление, что закрывает клавиатуру

- (void)hideTheKeyboard { 

    id <ShowArticDelegate> SA_delegate = _delegate; 
    // Don't update the database when there is no text. 
    if (![self.editableTextView.text isEqualToString:@""]) { 
     [SA_delegate updateTextInDatabase:self.editableTextView.text]; 
    } 
    [self.editableTextView resignFirstResponder]; 
} 

Эти методы отвечают на уведомления.

- (void)keyboardDidHide:(NSNotification *)notification { 
    NSLog(@"keyboardDidHide called. Keyboard showing flag is %@.", self.keyBoardIsShowing ? @"YES" : @"NO"); 
    self.keyBoardIsShowing = NO; 
    // Move the text, update the database 
} 

- (void)keyboardDidShow:(NSNotification *)notification { 
    NSLog(@"keyboardDidShow called. Keyboard showing flag is %@.", self.keyBoardIsShowing ? @"YES" : @"NO"); 
    self.keyBoardIsShowing = YES; 
    // Move the text 
} 

ответ

1

любой шанс, что вы можете вручную закрыть клавиатуру и очистить вашу базу данных внутри этого метода:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

, а затем, если вы хотите, чтобы клавиатура принесла обратно после того, как вращение завершается, вручную вызвать ваш способ отображения его изнутри:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 

это может быть или может не соответствовать вашим потребностям, но это довольно общий и чистый метод, чтобы «выйти из пути» в то время как Apple, ручки т он вращается, а затем возвращается к делу, как только все снова вернется на твердую землю.

+0

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

+0

Кто-то еще может прослушивать здесь более тонкое объяснение того, почему некоторые события ротации, похоже, приносят больше вызовов, чем им нужно, но я никогда не понял, почему именно так и всегда видел внутреннюю работу устройства вращение как «черный ящик» или частный API для Apple, чтобы разобраться. Скорее всего, это связано с тем, как iOS использует акселерометр, чтобы окончательно решить, что произошло ротация (подобно тому, как распознавание жестов на самом деле является длинной и запутанной последовательностью шагов), но я никогда не мог проверить его достаточно, чтобы определить точная рифма или причина. –

+0

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

Смежные вопросы