macos - Cocoa 数据绑定(bind) - 一个 View 对象绑定(bind)到两个 'enabled' 属性

标签 macos cocoa cocoa-bindings

使用 Cocoa 数据绑定(bind)我已将按钮的“启用”属性绑定(bind)到两个单独的“模型关键路径”(EnabledEnabled2)。

这个想法是,如果这些属性中的任何一个为 true,则该按钮将被启用。

不幸的是,只有当两者都成立时它才有效。

任何人都可以帮我将这个逻辑从AND更改为OR吗?

最佳答案

很酷的问题——我要在黑暗中进行一次尝试,直到明天我才能为您确认,但也许可以尝试一下?

创建一个新属性,enabledOrEnabled2(也许有一个更好的名称)。
覆盖此属性的 getter (-(BOOL)enabledOrEnabled2),
仅返回 (Enabled || Enabled2)

将 key 路径设置为enabledOrEnabled2

我有点怀疑这是否有效,因为 Cocoa Bindings 通过使用 KVC 和 KVO 来工作。所以 atm,您的 View Controller 正在观察您的 EnabledEnabled2 属性。在运行时发生的事情是,Cocoa 将使用它们自己的 KVO 属性覆盖您的属性,这些属性的外观和行为就像您想象的那样。除了 setter 已被覆盖,以向观察者发送通知。

我认为我的解决方案的问题是 -(void)setEnabledOrEnabled2 永远不会被调用,因为您只会设置 EnabledEnabled2 属性。因此,Cocoa 重写的 -(void)setEnabledOrEnabled2 永远不会通知您的观察 View Controller

编辑:刚刚阅读了 @stevesilva 的评论,甚至不知道 dependent keys是一件事。看起来如果你愿意的话你绝对可以这样实现

实际上,第一个想到的黑客方法是从重写 getter 方法(就像我第一次推荐的那样),转而重写 setter 方法:-(void)setEnabled-(void )setEnabled2,并添加一行,例如:_enabledOrEnabled2 = _Enabled || _启用2。这样,每当您设置两个 BOOL 属性时,它都会更新 enabledOrEnabled2,然后它将向其观察者(您的 View Controller )发送通知。

但是现在我已经写出来了,我想知道 Cocoa Bindings 的第二部分,KVC 在 View 看到变化时修改模型。

因为您实际上是在 Enabled 状态下使用 Bindings - 我实际上认为您不应该使用 Bindings。这是因为 View 实际上无法修改(即,您无法修改按钮的 enabled 状态)。因此,您不需要使用 KVC 来更改 enabledOrEnabled2,您只需要您的按钮观察 BOOL 即可知道是否应该启用它。

所以废弃我迄今为止所说的一切--
应该做的仍然是修改setter(-(void)setEnabled-(void)setEnabled2),并且在设置ivar之前应该添加一行:
[self.button setEnabled:(_Enabled || _Enabled2)];

这应该对你有用:)

抱歉有点啰嗦,我觉得我最初写的信息可能会有帮助,所以我决定不删除它

关于macos - Cocoa 数据绑定(bind) - 一个 View 对象绑定(bind)到两个 'enabled' 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929976/

相关文章:

macos - 打开新标签页时如何更改终端背景颜色?

swift - 在菜单栏应用程序中拖动并调整我的 NSPopover 大小(快速)

swift - audioStreamer 快速错误 cocoa.h

objective-c - Cocoa 绑定(bind) - NSTableView - 交换值

php - Mac OS X 连接速度慢 - mdns 4-5 秒 - bonjour 慢

macos - 打开/查看 Firebird 数据库的最简单方法是什么?

objective-c - NSWindow 隐藏事件窗口并专注于其他窗口

macos - 在 OSX 上重新打开窗口的正确方法是什么?

objective-c - 绑定(bind) NSOutlineView 的选择索引路径

cocoa - 将 NSArrayController 绑定(bind)到 NSDictionary allValues