Прослушайте изменение значения моего текстового поля - PullRequest
16 голосов
/ 29 мая 2011

Я пытаюсь понять, как перехватить событие «текст изменен» из текстового поля в моем окне. Я привык к "слушателям действия" Java и не могу найти ничего подобного в Objective-C / Cocoa. Я долго искал и нашел протокол «наблюдения значения ключа», но метод observeValueForKeyPath: (функция?) Срабатывает только тогда, когда значение моего текстового поля было изменено в коде (например, с использованием [textfield setStringValue:...]), а не набрав его.

Как я могу "прослушать" изменение значения, когда пользователь вводит текстовое поле?

Ответы [ 4 ]

36 голосов
/ 29 мая 2011

Вы можете установить делегат для своего экземпляра NSTextField, и делегат может реализовать следующий метод:

- (void)controlTextDidChange:(NSNotification *)notification {
    // there was a text change in some control
}

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

[myTextField setDelegate:delegateObject];

или, в Интерфейсном Разработчике, через выход delegate, доступный в элементе управления NSTextField.

Обратите внимание, что если к одному и тому же делегату подключено несколько элементов управления, то для каждого элемента управления будет отправляться -controlTextDidChange:, т. Е. Один и тот же метод вызывается для разных элементов управления. Если вам требуется другое поведение в соответствии с элементом управления, в котором текст был изменен, вы можете использовать -[NSNotification object] для определения элемента управления, отправившего уведомление.

Например, если у вас есть два текстовых поля с соответствующими выходами nameField и addressField, и вы установили один и тот же делегат для обоих полей, то:

- (void)controlTextDidChange:(NSNotification *)notification {
    // there was a text change in some control
    // [notification object] points to the control that has sent
    // the notification

    if ([notification object] == nameField) {
        // nameField has changed
    }
    else if ([notification object] == addressField) {
        // addressField has changed
    }
}

В качестве альтернативы вы можете иметь одного делегата для каждого текстового поля. В этом случае нет необходимости проверять [notification object].

3 голосов
/ 07 мая 2014

Вы также можете просто подключиться к «Редактированию изменений» из IB и создать Действие для его обработки

- (IBAction)txtField_Changed:(id)sender
{
   // my textfield has been changed
}
0 голосов
/ 07 августа 2016

Это работает для меня

func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String?) -> Bool {
    print("Changed!")
    return true
}
0 голосов
/ 29 мая 2011

Вы можете использовать textFieldShouldBeginEditing: метод UITextFieldDelegate.В iOS слушатели называются NSNotifications

EDIT

В target-c многие объекты UIO имеют соответствующий класс протокола, который называется "делегат".делегат отвечает за реагирование на события.Таким образом, чтобы иметь возможность отвечать или получать уведомления о действиях, вам необходимо реализовать делегат и его методы.

...