Отключить / включить NSButton, если NSTextfield пусто или нет - PullRequest
11 голосов
/ 16 сентября 2010

Я новичок с какао.У меня есть кнопка и текстовое поле в моем приложении.Я хочу, чтобы кнопка была отключена, когда текстовое поле пусто, и включена, когда пользователь что-то вводит.

Есть ли смысл начинать?Любая «волшебная» привязка в Интерфейсном Разработчике?

Спасибо

[EDITED]

Я попытался установить appDelegate как делегат NSTextfield и добавил этот методmyTextfield и myButton - это IBOutlets):

- (void)textDidChange:(NSNotification *)aNotification
{
    if ([[myTextField stringValue]length]>0) {
        [myButton setEnabled: YES];
    }
    else {
        [myButton setEnabled: NO];
    }
}

Но ничего не происходит ...

Ответы [ 4 ]

14 голосов
/ 16 сентября 2010

Я попытался установить 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.

Вы также можете присвоить контроллеру два свойства, одно из которых имеет логическое значение, и установить его как зависящее от свойства строки и привязать к нему кнопку.Это более чистое и, возможно, более надежное решение, хотя это и больше работы.

9 голосов
/ 03 июня 2014

Вот решение с использованием привязок.

Ниже я настраиваю NSTextField, который привязан к свойству text владельца текста.«текст» является строкой NSString. Я был пойман "Непрерывно обновляет значение". Думал, что мое решение не сработало, но на самом деле оно не обновлялось, когда пользователь печатал, и только когда текстовое поле потеряло фокус.

Binding the NSTextField to the file's owner NSString text property

А теперь, установив привязки для кнопки, просто установите ее включенное состояние равным длине текстового свойства владельца файла.

Binding the NSButton's enabled state to the text property's length

Ирабочий продукт.

enter image description here enter image description here

4 голосов
/ 28 мая 2011

Если вы используете controlTextDidChange вместо textDidChange, вы можете избавиться от уведомлений и просто полагаться на то, что являетесь делегатом NSTextField.

0 голосов
/ 17 сентября 2010

Спасибо, Питер.То, что я пропустил (в моей нелегкой версии), это кусок кода в awakeFromNib в appDelegate:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification object:myTextField];

Он отлично работает.Сейчас я пробую легкий путь, но боюсь, что я все еще недостаточно хорош с привязками.

Чтобы связать свойство

@property (retain) IBOutlet NSString *aStringValue;

со значением текстового поля, что я должен использовать в IB для «Привязать к:», «Ключ контроллера» и «Путь ключа модели»

...