NSNotification для одного объекта в Swift

У меня есть два текстовых поля, topTextField и bottomTextField, вверху и внизу экрана соответственно. bottomTextField прячется за виртуальной клавиатурой, когда она появляется, поэтому, чтобы исправить это, я использую NSNotification для прослушивания виртуальной клавиатуры и сдвигаю представление вверх, когда это происходит. Однако представление перемещается вверх всякий раз, когда клавиатура появляется на экране, в том числе, когда topTextField становится первым ответчиком, эффективно перемещая его за пределы экрана. Вот код:

    func subscribeToKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: bottomTextField)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: bottomTextField)
}

func unsubscribeToKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: bottomTextField)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: bottomTextField)
}

Первоначально у меня был nil в качестве параметра объекта в конце методов, и именно тогда я начал искать способ изолировать поведение только от bottomTextField.

Я предполагаю, что ключ к решению этой проблемы находится в параметре объекта в этих методах, где я сейчас передаю значение bottomTextField. в документации Apple для NSNotificationCenter говорится, что этот параметр предназначен для

Объект, чьи уведомления хочет получать наблюдатель; то есть наблюдателю доставляются только уведомления, отправленные этим отправителем.

Если вы передадите nil, центр уведомлений не будет использовать отправителя уведомления, чтобы решить, доставлять ли его наблюдателю.

Я интерпретирую это как то, что мы можем вызывать конкретный объект для прослушивания, поэтому в данном случае bottomTextField. Однако, когда я изменил их с nil на bottomTextField, представление больше не скользит вверх, а bottomTextField по-прежнему скрыт. Я неправильно интерпретирую это? Если нет, что я могу сделать, чтобы заставить это работать? И если я не прав, есть ли способ изолировать один объект для прослушивания с помощью NSNotification?


person twp    schedule 01.09.2015    source источник


Ответы (1)


Объект должен быть nil. Не текстовое поле

В обработчике проверьте, какие текстовые поля "прикрыты" клавиатурой

-(void)keyboardHandler:(NSNotufication *)note {

Cgrect keyboardFrame = [note.userInfo[keyboardframe] cgrectvalue]; // dont remember the key name (answering from my phone :)). Check uiapplication header. 

// check which text field is covered and move it

// you may need to convert the rect coordinates using:

cgrect windowFrame = [[[uiapplication sharedapplication] keyWindow] convertRect:textfieldFrame fromView:textfield.superView]];

If (windowFrame is covered by keyboard ...) { 
    Move text field....
}

надеюсь достаточно понятно....

person Avner Barr    schedule 01.09.2015
comment
Спасибо за ваш ответ. Я изменил свой код, чтобы проверить, какое текстовое поле было первым ответившим, и переместить клавиатуру, если оно было нижним. Отлично работает сейчас. Я все еще немного не понимаю, для чего будет использоваться параметрnotificationSender (объект), если не что-то вроде этого (я предполагаю, что это не сработало, потому что это не было текстовое поле, которое отправляло уведомление) . Какие вещи отправляют уведомления? В каких случаях я могу использовать этот последний параметр как что угодно, кроме нуля? - person twp; 02.09.2015
comment
В случаях, когда многие объекты во время выполнения могут выдавать одно и то же имя уведомления, и вы хотите отслеживать уведомления только от определенного объекта (имеет смысл указать экземпляр при регистрации). В тех случаях, когда система выдает уведомления, обычно нет никакой дополнительной ценности для регистрации на конкретный объект (часто это одиночный объект, и экземпляр ясен). Также в некоторых случаях эмиттер уведомления не прикрепляет достаточный контекст в объекте NSNotification (может быть, notification.object == nil?), но вам нужен экземпляр, который опубликовал - person Avner Barr; 02.09.2015
comment
Для тех, кто не знает, как проверить, какое текстовое поле отвечает первым, проверьте это переполнение стека. - person user3731622; 07.02.2016