objective-c - NSPopUpButton : multiple values & selectedIndex binding

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

上下文:

我有一个绑定(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/

相关文章:

objective-c - iPhone应用程序编程-导航到其他 View Controller 和转义导航 Controller

iphone - 关闭多个模态视图

iphone - 从 iPhone 中的核心数据生成和解析 XML

objective-c - NSArrayController 上的 SelectionIndexes 只返回一个值

objective-c - 在 Cocoa-Touch 的 header 中放置 "const double NA = 1e-300"错误,但在 Cocoa 中则不然?

macos - 对逗号分隔的值列表进行排序

objective-c - 如何在核心数据关系实际发生变化之前观察它?

xcode - 绑定(bind)到用户默认值中数组的@count

macos - 相当于 Mac 上的 MFMailComposer

macos - 如何在 Mac osx Lion 中创建 .conf 文件?