我试图弄清楚使用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来显示值,然后在选择上设置标签的值(使用对象控制器).但是,尽管这很聪明,但它不适合我试图实现的用例.所以我转到这里寻求帮助
中号
好的,与它的绑定NSPopUpButton
有点复杂,因为它需要两件事:对值的绑定,以及为其中一个值选择的绑定.更复杂的是,有几种完全合法的方式,你选择哪一种完全取决于你的程序结构,在某种程度上取决于个人偏好.
因此,为了获取值列表,您绑定content
属性.在你的情况下,你可能会将它绑定到一个arrangedObjects
键NSArrayController
.在此设置中,每个菜单项代表一个对象.默认情况下,菜单项的标题是通过调用description
数组中的每个项返回的字符串.如果要为菜单标题使用不同的属性,还可以绑定contentValues
数组.只需确保您指定contentValues
的密钥路径具有content
作为其前缀的密钥路径(例如,您可能使用arrangedObjects
for content
和arrangedObjects.name
for contentValues
)
这将为您提供表示对象的菜单项.接下来你需要的是识别所选择的一种方法.有三种不同的绑定可以使用:selectedIndex
,selectedObject
和selectedValue
.它们分别表示用户选择的数组对象的索引,对象值(content
数组中的一个对象),以及所选项的字符串标题(contentValues
如果绑定该属性,则表示数组中的一个对象)).
因此,在您的情况下,您可能绑定selectedObject
到selectedSerialPort
控制器类上的属性.当用户单击"连接"按钮时,您只需要引用该selectedSerialPort
属性.
您可以在此处下载示例Xcode项目.这样我就能尽可能接近你的描述.
重要的是要查看数组控制器,AppController和弹出框之间的连接.
基本上,这只是表明亚历克斯所说的.