Прослушать изменение значения моего текстового поля

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

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

Ответы

Ответ 1

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

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

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

[myTextField setDelegate:delegateObject];

или в интерфейсе Builder через выход 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].

Ответ 2

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

- (IBAction)txtField_Changed:(id)sender
{
   // my textfield has been changed
}

Ответ 3

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

func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String?) -> Bool {
    print("Changed!")
    return true
}

Ответ 4

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

EDIT

В objective-c много UIObjects имеют соответствующий класс протокола, который называется "делегат". Делегат отвечает за реакцию на события. Чтобы иметь возможность отвечать или получать уведомления о действиях, вам необходимо реализовать делегат и его методы.