上下文:
我有一个绑定(bind)到 Core Data 的 NSArrayController,它为 NSTableView 提供行。当用户选择行时,arrayController 的“selectedObjects”属性会发生变化。
现在,每个“selectedObjects”都是一个名为“LPFile”的核心数据实体,它有一个名为“style”的属性,它是一个从 0 到 3 的整数。“style”属性应该对应于一个对象的 selectedIndex NSPopUpButton.
我的问题:
如果用户选择多行并且与这些行关联的 LPFiles 具有相同的“样式”值,我希望 NSPopUpButton 将其“selectedIndex”属性设置为该值。如果行的对象具有不同的“样式”值,则 NSPopUpButton 应显示空白行。 (当用户随后选择一种样式时,该空白行应该从 NSPopUpButton 中消失。)
我知道如何通过手动编写代码来实现这一点,如果选择仅限于单行,我可以设置这些绑定(bind),但是我如何设置绑定(bind)来处理可能具有或可能不具有不同值的多个选定对象为了“风格”?我用 Google 搜索了很多,但找不到具体信息,而且我已经厌倦了试验! (注意:我在 IB 中为 NSPopUpButton 提供了内容项,因此我没有将任何内容绑定(bind)到按钮的内容绑定(bind)。)
最佳答案
您可能需要编写一些代码,但您仍然可以使用绑定(bind)来控制 UI 元素,在本例中为弹出按钮。
这是一种对我有用的方法:
在为数组 Controller 提供内容的 Controller 中,定义一个属性,该属性包含与 TableView 中的选择对应的选择索引集。将其绑定(bind)到数组 Controller 的选择索引集,因此它始终会更新并与 TableView 同步。为简单起见,我在下面将其称为 fileSelectionIndexSet
。
然后,定义一个为弹出按钮提供索引的属性。下面,我将其称为 styleIndex
。
您可以将弹出按钮选择索引绑定(bind)到此属性。您可能还必须从 Controller 提供其内容。例如,这将是一个返回静态字符串数组的只读属性。
// Header file, just synthezise in implementation
@property (retain) NSInteger styleIndex;
将 Controller 注册为它自己的 fileSelectionIndexSet
属性的观察者:
// It doesn't have to be awakeFromNib, any method will do if called before
// you need the functionality
-(void)awakeFromNib
{
[self addObserver:self
forKeyPath: @"fileSelectionIndexSet"
options:NSKeyValueObservingOptionNew
context:NULL];
}
- (void) observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ( [keyPath isEqualToString: @"fileSelectionIndexSet"] )
{
NSInteger index;
index = ... // Compute value based on current LPFile selection
self.styleIndex = index;
}
}
将 self 实现为自身属性的观察者,使 styleIndex
属性成为 fileSelectionIndexSet
的单向依赖项。
这意味着每当用户在 TableView 中更改选择时,弹出按钮都会更新。然而,当用户在弹出按钮中更改选择时, TableView 中没有任何更改。
关于objective-c - NSPopUpButton : multiple values & selectedIndex binding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6560745/