Отключить/включить NSButton, если NSTextfield пуст или нет.
Я новичок с cocoa. У меня есть кнопка и текстовое поле в моем приложении. Я хочу, чтобы кнопка была отключена, когда текстовое поле пуст и включено, когда пользователь что-то набирает.
С чего начать? Любая "магическая" привязка в Interface Builder?
Спасибо
[Изменено]
Я попытался установить appDelegate как делегат NSTextfield и добавил этот метод (myTextfield и myButton - IBOutlets):
- (void)textDidChange:(NSNotification *)aNotification
{
if ([[myTextField stringValue]length]>0) {
[myButton setEnabled: YES];
}
else {
[myButton setEnabled: NO];
}
}
Но ничего не происходит...
Ответы
Ответ 1
Я попытался установить appDelegate как делегат NSTextfield и добавил этот метод (myTextfield и myButton - IBOutlets):
- (void)textDidChange:(NSNotification *)aNotification
{
if ([[myTextField stringValue]length]>0) {
[myButton setEnabled: YES];
}
else {
[myButton setEnabled: NO];
}
}
Это трудный путь, но он должен работать нормально. Либо вы не подключили выход текстового поля delegate
к этому объекту, вы не подключили выход myTextField
к текстовому полю, или вы не подключили выход myButton
к кнопке.
Другим способом было бы дать контроллеру свойство, отображающее строковое значение, привязать текстовое поле value
привязку к этому свойству stringValue
и привязать кнопку enabled
к контроллеру stringValue.length
.
Вы также можете указать контроллеру два свойства, одно из которых имеет логическое значение, и установить его в зависимости от свойства строки и привязать к нему кнопку. Это более чистое и, возможно, более надежное решение, хотя это больше работает.
Ответ 2
Вот решение, использующее привязки.
Ниже я устанавливаю NSTextField, привязанный к свойству "text" владельца файла. "text" - это NSString. Я был пойман "Continuously Updates Value". Думаю, что мое решение не работает, но на самом деле оно не обновлялось при вводе пользователя и только тогда, когда текстовое поле потеряло фокус.
![Binding the NSTextField to the file's owner NSString text property]()
И теперь, настраивая привязки на кнопке, просто установите ее включенное состояние на длину свойства текста владельца файла.
![Binding the NSButton's enabled state to the text property's length]()
Annd, рабочий продукт.
![enter image description here]()
![enter image description here]()
Ответ 3
Если вы используете controlTextDidChange вместо textDidChange, вы можете избавиться от материала уведомления и просто полагаться на делегат NSTextField.
Ответ 4
Спасибо, Питер. То, что я пропустил (в моей сложной версии), - это часть кода в awakeFromNib в appDelegate:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification object:myTextField];
Он отлично работает. Теперь я пробую легкий путь, но я боюсь, что я недостаточно хорош с привязками.
Чтобы связать свойство
@property (retain) IBOutlet NSString *aStringValue;
с значением текстового поля, что я должен использовать в IB для "Привязать к:", "Ключу контроллера" и "Путь ключа модели"?