这是我在Xcode Interface Builder中的情况:
实体模式中还有一个控制NSTableView内容的NSArrayController。当NSSearchField中的文本不为空时,我想在NSTableView为空(由NSSearchField控制) AND 时启用“创建”按钮。我如何实现这一目标?没有编程可以吗?
对于符合KVO标准的值,我可以绑定“创建”按钮的2个启用条件吗?
答案 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
键。