NSPopUpButton,Bindings和缩短寿命

时间:2009-04-10 14:34:04

标签: objective-c cocoa macos

我正在努力解决使用NSPopUpButton的难度。它是迄今为止在Cocoa中编程最困难的用户元素(至少就我所发现的而言)。

我想到的用例如下:

  • 我有一个名为Port的类,代表一个串口。
  • 其中的属性是名称字段。
  • 在NSPopUpButton中,我想显示每个端口的名称字段。
  • 当用户选择特定端口时,会在弹出窗口中标记为预期的打勾
  • 当用户随后点击连接按钮时,我可以确定选择了阵列中的哪个端口。
  • 我想用绑定来实现这个目标,因为一旦我了解它,它将是更优雅的解决方案。

因此,在我的AppController.h中,我期待两个属性,我可以将它们创建为属性并合成:

NSMutableArray *allPorts;
Port *currentlySelectedPort;

我的.m中的一个动作:

-(void)didSelectConnect:(id)sender{
    NSLog(@"Selected port name is:%@",[currentlySelectedPort name]);
}

在Port.h中我有

NSString *name;
NSString *baudRate;
... etc ...

我创建了一个简单的项目,它只包含一个弹出窗口(和一个标签),并且在各篇文章之后,我已经设法用一个元素填充NSMutableArray,然后我使用ArrayController来显示值,然后在选择上设置值标签(使用对象控制器)。但是,尽管这很聪明,但它不适合我试图实现的用例。所以我转到这里寻求帮助

中号

2 个答案:

答案 0 :(得分:12)

好的,与NSPopUpButton的绑定有点复杂,因为它需要两件事:绑定值,以及选择其中一个值的绑定。更复杂的是,有几种完全合法的方式,你选择哪一种完全取决于你的程序结构,在某种程度上取决于个人喜好。

因此,为了获取值列表,您绑定content属性。在您的情况下,您可能会将其绑定到arrangedObjects的{​​{1}}键。在此设置中,每个菜单项代表一个对象。默认情况下,菜单项的标题是通过在数组中的每个项目上调用NSArrayController返回的字符串。如果要为菜单标题使用不同的属性,还可以绑定description数组。只需确保您为contentValues指定的密钥路径具有contentValues作为其前缀的密钥路径(例如,您可以content使用arrangedObjectscontent arrangedObjects.name

这将为您提供表示对象的菜单项。接下来你需要的是识别所选择的一种方法。您可以使用三种不同的绑定:contentValuesselectedIndexselectedObject。它们分别表示用户选择的数组对象的索引,对象值(selectedValue数组中的一个对象),以及所选项的字符串标题({中的一个对象)如果绑定该属性,则为{1}}数组。)

因此,在您的情况下,您可以将content绑定到控制器类的contentValues属性。当用户单击“连接”按钮时,您只需要引用selectedObject属性。

答案 1 :(得分:6)

您可以下载sample Xcode project here。这样我就能尽可能地了解你的描述。

重要的是查看数组控制器,AppController和弹出框之间的连接。

基本上,这只是表明亚历克斯所说的。