NSPopUpButton:多个值和 selectedIndex 绑定
Posted
技术标签:
【中文标题】NSPopUpButton:多个值和 selectedIndex 绑定【英文标题】:NSPopUpButton: multiple values & selectedIndex binding 【发布时间】:2011-07-03 02:29:01 【问题描述】:上下文:
我有一个与 Core Data 绑定的 NSArrayController,它为 NSTableView 提供行。当用户选择行时,arrayController 的“selectedObjects”属性会发生变化。
现在,这些“selectedObjects”中的每一个都是一个名为“LPFile”的核心数据实体,它有一个名为“style”的属性,它是一个从 0 到 3 的整数。“style”属性应该对应于一个NSPopUpButton.
我的问题:
如果用户选择多行并且与这些行关联的 LPFile 具有相同的“样式”值,我希望 NSPopUpButton 将其“selectedIndex”属性设置为该值。如果行的对象具有不同的“样式”值,则 NSPopUpButton 应该显示一个空白行。 (当用户随后选择一种样式时,该空白行应从 NSPopUpButton 中消失。)
我知道如何通过手动编写代码来实现这一点,如果选择仅限于单行,我可以设置这些绑定,但我如何设置绑定来处理可能具有或不具有不同值的多个选定对象为“风格”?我用谷歌搜索了很多,但找不到具体信息,我厌倦了试验! (注意:我在 IB 中为 NSPopUpButton 提供内容项,所以我没有将任何内容绑定到按钮的内容绑定。)
【问题讨论】:
【参考方案1】:您可能需要编写一些代码,但您仍然可以使用绑定来控制 UI 元素,在本例中为弹出按钮。
这是一种对我有用的方法:
在为数组控制器提供内容的控制器中,定义一个属性,该属性包含与表格视图中的选择相对应的选择索引集。将它绑定到数组控制器的选择索引集,因此它总是与表视图更新并同步。为简单起见,我在下面将其称为fileSelectionIndexSet
。
然后,定义一个为弹出按钮提供索引的属性。下面,我称之为styleIndex
。
您可以将弹出按钮选择索引绑定到此属性。您可能还必须从控制器提供其内容。例如,这将是一个返回静态字符串数组的只读属性。
// 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
的单向依赖项。
这意味着每当用户更改表格视图中的选择时,弹出按钮都会更新。但是,当用户更改弹出按钮中的选择时,表格视图中没有任何变化。
【讨论】:
以上是关于NSPopUpButton:多个值和 selectedIndex 绑定的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式控制 NSPopUpButton 上的 TAB 按键事件