如何将NSButton启用状态绑定到组合条件

时间:2011-12-31 00:25:04

标签: cocoa interface-builder key-value-observing nsarraycontroller nsbutton

这是我在Xcode Interface Builder中的情况:

IB situation

实体模式中还有一个控制NSTableView内容的NSArrayController。当NSSearchField中的文本不为空时,我想在NSTableView为空(由NSSearchField控制) AND 时启用“创建”按钮。我如何实现这一目标?没有编程可以吗?

对于符合KVO标准的值,我可以绑定“创建”按钮的2个启用条件吗?

3 个答案:

答案 0 :(得分:3)

我已经很晚了,但想出了另一种方法,并在我的应用程序中测试了它。它有效,所以我将分享给将来会发现这个问题的人。

基本上你想要做的是在你的控制器中创建一个没有相应值的属性

     @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中,将控件的启用属性绑定到此“假”属性。

享受! ;)

答案 1 :(得分:2)

我认为没有办法完全在界面构建器中完成它,但只需少量代码就可以轻松地完成它。首先,确保您的控制器(或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];
    }
}

如果您不熟悉绑定,其中一些可能看起来像希腊语,希望评论足够清楚。

答案 2 :(得分:1)

你似乎有一个窗口,所以你可能有一个控制器对象被设置为NIB文件的文件所有者。

为什么不在这个控制器类中声明一个布尔属性,它根据你想要的条件返回一个值?

@property(readonly) BOOL canCreate;

您实施:

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

确保在创建条件发生变化时适当发送KVO通知 最后一步是将按钮的enabled绑定绑定到文件的所有者canCreate键。