在加载表单时恢复对 NSPopUpButton 的选择

Posted

技术标签:

【中文标题】在加载表单时恢复对 NSPopUpButton 的选择【英文标题】:Restoring selection to NSPopUpButton on loading a form 【发布时间】:2013-09-27 12:56:07 【问题描述】:

请帮忙,这快把我逼疯了:(

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

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

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

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

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

这里有一些代码示例可以提供帮助:

@implementation sn-p:

IBOutlet NSPopUpButton *popMediaType;
IBOutlet NSArrayController *acMediaTypes;

@property (nonatomic, copy) NSString *selMediaType;

@interface sn-p:

- (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】:

最终解决方案很简单,但对游戏的新玩家来说并不明显。

首先,将选择绑定到的接收者变量必须是属性而不仅仅是 iVar

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

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

【讨论】:

以上是关于在加载表单时恢复对 NSPopUpButton 的选择的主要内容,如果未能解决你的问题,请参考以下文章

单击以编程方式定义的 NSPopUpButton 时出错

如何以编程方式控制 NSPopUpButton 上的 TAB 按键事件

如何更改 NSPopUpButton 中 NSMenuItem 的短显示形式?

如何在程序运行之间保存/恢复表单和控件?

Django:jQuery触发表单提交onchange of checkbox并保留重新加载时的值

在 NSPanel 中初始化控件