我有一个NSArrayController绑定到Core Data,为NSTableView提供行。当用户选择行时,arrayController的“selectedObjects”属性会更改。
现在,每个“selectedObjects”都是一个名为“LPFile”的核心数据实体,它有一个名为“style”的属性,它是一个0到3之间的整数。“style”属性应该对应于一个NSPopUpButton。
如果用户选择多行并且与这些行关联的LPFiles具有相同的“style”值,我希望NSPopUpButton将其“selectedIndex”属性设置为该值。如果行的对象具有“样式”的不同值,则NSPopUpButton应显示空行。 (当用户选择样式时,该空白行应从NSPopUpButton中消失。)
我知道如何通过手动编写代码来实现这一点,如果选择仅限于一行,我可以设置这些绑定,但是如何设置绑定来处理多个选定的对象,这些对象可能有也可能没有不同的值为“风格”?我用谷歌搜索了一下,但找不到具体的信息,我厌倦了试验! (注意:我在IB中提供了NSPopUpButton的内容项,因此我没有将任何内容绑定到按钮的内容绑定。)
答案 0 :(得分:2)
您可能需要编写一些代码,但您仍然可以使用绑定来控制UI元素,在这种情况下是弹出按钮。
这是一种对我有用的方法:
在为数组控制器提供内容的控制器中,定义一个属性,该属性包含与表视图中的选择对应的选择索引集。将它绑定到阵列控制器的选择索引集,因此它始终更新并与表视图同步。为简单起见,我在下面将其称为fileSelectionIndexSet
。
然后,定义一个为弹出按钮提供索引的属性。下面,我称之为styleIndex
。
您可以将弹出按钮选择索引绑定到此属性。您可能还必须从控制器提供其内容。例如,这将是一个readonly属性,返回一个静态的字符串数组。
// Header file, just synthezise in implementation
@property (retain) NSInteger styleIndex;
将控制器注册为其自己的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
。
这意味着每当用户更改表视图中的选择时,弹出按钮都会更新。但是,当用户更改弹出按钮中的选择时,表视图中不会更改任何内容。