Прослушайте изменение значения моего текстового поля
Я пытаюсь понять, как перехватить событие "текст изменен" из текстового поля в моем окне. Я привык к "слушателям действия" 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 имеют соответствующий класс протокола, который называется "делегат". Делегат отвечает за реакцию на события. Таким образом, чтобы иметь возможность отвечать или получать уведомления о действиях, вам необходимо реализовать делегат и его методы.