Сохранять ли выровненную панель инструментов iPhone видимой при первой смене респондента? - PullRequest
3 голосов
/ 10 июля 2009

Я использую метод, описанный Джошем в этом вопросе , чтобы добавить панель инструментов в верхней части клавиатуры iPhone. По сути, идея такова:

  • Добавить контроллер представления в качестве наблюдателя для уведомлений UIKeyboardWillShowNotification и UIKeyboardWillHideNotification в методе его инициализации
  • Всякий раз, когда эти уведомления публикуются, анимируйте панель инструментов на / выкл экрана вместе с клавиатурой

У меня также есть несколько полей UITextField на экране, все из которых становятся первыми респондентами при выборе для редактирования и уходят первыми респондентами, когда редактирование завершено (либо пользователь нажимает на другое текстовое поле, либо на любое текстовое поле, либо нажимает «Готово»). на клавиатуре - у меня textFieldShouldReturn: переопределено на resignFirstResponder).

У меня проблема, так как уведомления публикуются каждый раз, когда я переключаюсь между текстовыми полями. Например, если пользователь редактирует текстовое поле A, затем заканчивает его и нажимает на текстовое поле B, A уходит в отставку первым респондентом, а B становится первым респондентом. Тем не менее, он также отправляет уведомления «покажет» и «будет скрывать» в мой контроллер представления.

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

Есть ли способ отвечать на уведомления "будет {показывать, скрывать}", только если клавиатура на самом деле собирается показать или скрыть? Другими словами, как я могу игнорировать уведомления, которые не приведут к изменению видимого состояния клавиатуры?

Ответы [ 2 ]

4 голосов
/ 10 июля 2009

Чтобы проконтролировать ответ Рида: я завел следующую реализацию. Он использует BOOL для отслеживания того, находится ли контроллер между сообщениями textFieldShouldBeginEditing: и textFieldDidBeginEditing:, а также ивар для отслеживания текущего редактируемого текстового поля.

В реализации предполагается, что интерфейс имеет следующее с соответствующими свойствами и @synthesize маркерами. MyKeyboardToolbar - это подкласс UIToolbar с настраиваемым инициализатором для создания собственных кнопок.

BOOL shouldBeginEditing;
UITextField *editingField;
MyKeyboardToolbar *keyboardBar;

И сам код:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // Give up first responder so the keyboard goes away
    [textField resignFirstResponder];

    return YES;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    self.shouldBeginEditing = YES;
    return YES;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    self.shouldBeginEditing = NO;
    self.editingField = textField;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    // Do things here with the edited data (e.g. save it somewhere)

    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.editingField = nil;
}

// These methods are added as the observers to the notification center
- (void)keyboardWillShow:(NSNotification *)notification {
    if(self.keyboardBar == nil) {
        // Create and show the keyboard toolbar
    }
}

- (void)keyboardWillHide:(NSNotification *)notification {
    if(![self shouldBeginEditing]) {
        // Animate the bar off the screen, if necessary

        // Remove and dispense of the bar entirely
        [self.keyboardBar removeFromSuperview];
        self.keyboardBar = nil;
    }
}

// This method's selector is given to the keyboard toolbar's Done button
- (void)didPressKeyboardBarDoneButton {
    [self.editingField resignFirstResponder];
}
4 голосов
/ 10 июля 2009

Вам нужно создать BOOL ivar, чтобы отслеживать, видна ли уже клавиатура, так что вы будете хорошо использовать все методы делегата UITextField :). Панели инструментов с несколькими текстовыми полями могут быть сложными, но очень близко!

...