Я получаю несколько уведомлений 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
}
Мне больше всего любопытно, что вызывает уведомления о пожаре. Ваше решение работает для этого конкретного случая, хотя я его не использую. Единственное, что происходит с несколькими уведомлениями, это то, что обновление базы данных вызывается несколько раз. Поскольку в текстовом поле нет текста, когда экран вращается, я получаю пустую строку в базе данных. Если я проверю, пустой ли текст, тогда я в порядке. – JScarry
Кто-то еще может прослушивать здесь более тонкое объяснение того, почему некоторые события ротации, похоже, приносят больше вызовов, чем им нужно, но я никогда не понял, почему именно так и всегда видел внутреннюю работу устройства вращение как «черный ящик» или частный API для Apple, чтобы разобраться. Скорее всего, это связано с тем, как iOS использует акселерометр, чтобы окончательно решить, что произошло ротация (подобно тому, как распознавание жестов на самом деле является длинной и запутанной последовательностью шагов), но я никогда не мог проверить его достаточно, чтобы определить точная рифма или причина. –
Я подозреваю, что поэтому они дают нам два отличных шанса только до и сразу после поворота, чтобы очистить и уйти с дороги. Но это только моя теория. –