NSPopUpButton:多个值& selectedIndex绑定

时间:2011-07-03 02:29:02

标签: objective-c cocoa macos core-data cocoa-bindings

上下文:

我有一个NSArrayController绑定到Core Data,为NSTableView提供行。当用户选择行时,arrayController的“selectedObjects”属性会更改。

现在,每个“selectedObjects”都是一个名为“LPFile”的核心数据实体,它有一个名为“style”的属性,它是一个0到3之间的整数。“style”属性应该对应于一个NSPopUpButton。

我的问题:

如果用户选择多行并且与这些行关联的LPFiles具有相同的“style”值,我希望NSPopUpButton将其“selectedIndex”属性设置为该值。如果行的对象具有“样式”的不同值,则NSPopUpButton应显示空行。 (当用户选择样式时,该空白行应从NSPopUpButton中消失。)

我知道如何通过手动编写代码来实现这一点,如果选择仅限于一行,我可以设置这些绑定,但是如何设置绑定来处理多个选定的对象,这些对象可能有也可能没有不同的值为“风格”?我用谷歌搜索了一下,但找不到具体的信息,我厌倦了试验! (注意:我在IB中提供了NSPopUpButton的内容项,因此我没有将任何内容绑定到按钮的内容绑定。)

1 个答案:

答案 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

这意味着每当用户更改表视图中的选择时,弹出按钮都会更新。但是,当用户更改弹出按钮中的选择时,表视图中不会更改任何内容。