Как связать включенное состояние NSButton с составным условием - PullRequest
1 голос
/ 31 декабря 2011

Это моя ситуация в Xcode Interface Builder:

IB situation

Существует также NSArrayController в режиме объекта, который управляет содержимым NSTableView.Я хочу включить кнопку «Создать», когда NSTableView пуст (как управляется NSSearchField) И , когда текст в NSSearchField не пуст.Как мне этого добиться?Возможно ли это без программирования?

С какими значениями, совместимыми с KVO, можно связать 2 включенных условия кнопки «Создать»?

Ответы [ 3 ]

3 голосов
/ 24 января 2013

Я ОЧЕНЬ опаздываю на это, но придумала другой метод и просто проверила его в своем приложении. Это работает, так что я собираюсь поделиться им с каждым, кто найдет этот вопрос в будущем.

По сути, вы хотите создать свойство БЕЗ соответствующего значения в вашем контроллере

     @property (readonly) BOOL enableProperty;

Это означает, что на самом деле нет

    BOOL enableProperty;

определено в заголовочном файле или в любом месте

тогда, вместо того, чтобы синтезировать его, просто напишите свой собственный метод получения и поместите туда свое условие

    - (BOOL) enableProperty{
        return (condition);
    }

Третий шаг: всякий раз, когда есть вероятность, что ваше состояние изменится, сообщите об этом.

    - (void) someMethod{
        //.... Some code
        [self willChangeValueForKey:@"enableProperty"];
        [Thisline mightChange:theCondition];
        [self didChangeValueForKey:@"enableProperty"];
        //.... Some other code
    }

четвертый шаг: в IB свяжите свойство enabled вашего элемента управления с этим «поддельным» свойством.

Наслаждайтесь! ;)

2 голосов
/ 31 декабря 2011

Я не думаю, что есть способ сделать это полностью в конструкторе интерфейсов, но с небольшим количеством кода вы можете довольно легко заставить его работать.Во-первых, убедитесь, что ваш контроллер (или App Delegate) установлен в качестве делегата поля поиска и что он имеет соединения IBOutlet с полем поиска, кнопкой и контроллером массива.Вот как я бы это реализовал:

// This is an arbitrary pointer to indicate which property has changed.
void *kObjectsChangedContext = &kObjectsChangedContext;

- (void)awakeFromNib {

    // Register as an observer so we're notified when the objects change, and initially at startup.
    [arrayController addObserver:self
                      forKeyPath:@"arrangedObjects"
                         options:NSKeyValueObservingOptionInitial
                         context:kObjectsChangedContext];
}

// This updates the button state (based on your specs)
- (void)updateButton {

    BOOL canCreate = (searchField.stringValue.length > 0 &&
                      0 == [arrayController.arrangedObjects count]);
    [createButton setEnabled:canCreate];
}

// This delegate method is called whenever the text changes; Update the button.
- (void)controlTextDidChange:(NSNotification *)obj {
    [self updateButton];
}

// Here's where we get our KVO notifications; Update the button.
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if (kObjectsChangedContext == context)
        [self updateButton];

    // It's good practice to pass on any notifications we're not registered for.
    else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

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

1 голос
/ 09 мая 2013

Похоже, у вас есть окно, поэтому, вероятно, у вас есть объект контроллера, который установлен в качестве владельца файла для файла NIB.

Почему бы не объявить логическое свойство в этом классе контроллера, которое возвращает значениена основе любых условий, которые вы хотите?

@property(readonly) BOOL canCreate;

Что вы реализуете:

-(BOOL)canCreate {
    // compute and return the value
}

Обязательно отправляйте уведомления KVO соответствующим образом, когда условия для создания изменяются.
Последний шагпривязать кнопку enabled к ключу владельца файла canCreate.

...