Ответ 1
Если вы просто хотите определить, когда изменилось значение текстового поля, вы можете использовать метод делегирования controlTextDidChange:
, который NSTextField
наследует от NSControl
.
Просто подключите выход delegate
к NSTextField
в файле nib к классу контроллера и выполните следующее:
- (void)controlTextDidChange:(NSNotification *)notification {
NSTextField *textField = [notification object];
NSLog(@"controlTextDidChange: stringValue == %@", [textField stringValue]);
}
Если вы создаете NSTextField
программно, вы можете использовать метод NSTextField
setDelegate: после создания, чтобы указать делегата:
NSTextField *textField = [[[NSTextField alloc] initWithFrame:someRect] autorelease];
[textField setDelegate:self]; // or whatever object you want
Делегирование является одним из основных шаблонов проектирования, используемых во всем Cocoa. Вкратце, это позволяет вам легко настраивать поведение стандартных объектов (в данном случае объектов пользовательского интерфейса) без сложностей, связанных с необходимостью подклассификации объекта, чтобы добавить это дополнительное поведение. Например, другой способ нижнего уровня для обнаружения, когда текст в текстовом поле изменился, может заключаться в создании собственного пользовательского подкласса NSTextField
, в котором вы переопределяете keyDown:
, который NSTextField
наследует от NSResponder
. Однако подклассификация подобна, потому что это может потребовать, чтобы у вас было глубокое знание иерархии наследования объектов. Для получения дополнительной информации обязательно проверьте следующее:
Cocoa Руководство по основам: делегаты и источники данных
Относительно того, что означает id <NSTextFieldDelegate>
: это означает общий объект (id
), который объявляет себя соответствующим протоколу <NSTextFieldDelegate>
. Подробнее о протоколах см. Objective-C Язык программирования: Протоколы.
Пример проекта GitHub: https://github.com/NSGod/MDControlTextDidChange