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

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

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

4 ответа

Решение

Вы можете установить делегата для вашего 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],

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

Другие вопросы по тегам