在加载表单时将选择恢复到NSPopUpButton

时间:2013-09-27 12:56:07

标签: objective-c cocoa data-binding xcode5 nspopupbutton

请帮助,这让我很生气:(

我有一个表单作为我正在编写的OSX Cocoa应用程序的一部分,它使用NSPopUpButton来选择您正在创建/编辑的记录类型。

我正在使用绑定将弹出按钮绑定到数组控制器,并且我选择的值绑定到NSString。

我可以填充弹出窗口,可以选择一个项目并保存记录,但有两件事情我无法做到:

1)所选值对象包含项目的文本名称而不是其键 - 我已设置内容对象绑定

2)我无法在重新加载表单时恢复弹出窗口的选定项目。

以下是一些协助的代码示例:

@implementation片段:

IBOutlet NSPopUpButton *popMediaType;
IBOutlet NSArrayController *acMediaTypes;

@property (nonatomic, copy) NSString *selMediaType;

@interface片段:

- (void)setupForm {
    NSArray *types = [[NSArray alloc] initWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"Video", @"name", @"video", @"value", nil],
                                                       [NSDictionary dictionaryWithObjectsAndKeys:@"Advert", @"name", @"advert", @"value", nil],
                                                       [NSDictionary dictionaryWithObjectsAndKeys:@"Graphic", @"name", @"graphic", @"value", nil],
                                                       nil];

    [acMediaTypes setContent:types];
}

在界面构建器中:

acMediaTypes是名为mediaTypes的数组控制器对象的引用插座 popMediaType是表单

上NSPopUpButton的引用插座

我的NSPopUpButton的绑定因此配置:

Content (mediaTypes.arrangedObjects)
Bind to: mediaTypes
Controller Key: arrangedObjects
Model Key Path: <null>

Content Objects (mediaTypes.arrangedObjects)
Bind to: mediaTypes
Controller Key: arrangedObjects
Model Key Path: value

Content Values (mediaTypes.arrangedObjects)
Bind to: mediaTypes
Controller Key: arrangedObjects
Model Key Path: name

Selected Value (File's Owner.selMediaType)
Bind to: Files Owner
Controller key: <null>
Model Key Path: selMediaType

弹出窗口正确显示,正确显示数组“名称”部分的文本。

如果我使用类似NSLog()的内容在我的代码中读取selMediaType,那么我会看到“视频”,例如,如果该项目被选中 - 它应该是“视频”(小写来自“值”部分)字典)

我可以毫无问题地将值存储在我的sqlite数据库中,并使用终端中的sqlite3进行检查,并保存所有内容。

如果我从表格中加载值,我会认为只是设置selMediatype会重置NSPopUpButton中的项目位置,但事实并非如此。

1 个答案:

答案 0 :(得分:0)

最终解决方案很容易,但对于新玩家来说并不明显。

首先,绑定选择的收件人变量必须是属性而不仅仅是iVar

其次,在绑定中,绑定所选对象,而不是选中的值。

绑定选定值会将显示的值放在目标变量中,例如“视频”,但绑定到选定对象会将键放在目标变量中,例如“视频”。