Отключить/включить 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 hereenter 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 для "Привязать к:", "Ключу контроллера" и "Путь ключа модели"?