0

似乎有很多关于绑定 NSPopupButton 的问题,所以我觉得为此苦苦挣扎要好一些,但似乎没有一个能解决我的问题。

我有一个 NSManagedObject 子类,它与另一个类具有一对多的关系。假设 Foo 与 Bar 有关系,所以 Foo 有一个属性是 Bars 的 NSSet。

我创建了一个 NSArrayController 并将其 contentSet 绑定到 Foo 对象和“bars”键路径。

然后我将我的 NSPopupButton 的内容绑定到数组控制器的排列对象,并将它的 contentValues 绑定到数组控制器的排列对象(控制器键)和“名称”(我要显示的 Bar 上的属性)。

到目前为止,这一切都很好,但是当我尝试将 NSPopupButton 的选定对象绑定到数组控制器的选择时,NSPopupButton 显示“<_NSArrayControllerObjectProxy”。我还尝试添加“名称”作为此绑定的 keyPath,这确实使 NSPopupButton 正确显示名称,但是当我在弹出窗口中更改选择时,应用程序抛出异常:

Unacceptable type of value for attribute: property = "name"; desired type = NSString; given type = Bar;

我想这是有道理的,因为弹出窗口试图将“名称”的字符串值设置为选定的栏。我想我因此需要绑定一个选定的对象和一个选定的值,但如果我有一个选定的对象集,XIB 将禁用选定的值。

我也尝试过绑定选定的值,这一半有效(数组控制器的选择确实发生了变化),但弹出菜单中的选项不会改变以显示被取消选择的选项并隐藏新选择的选项)。

失败了这一切,我在这里读了一篇文章:http: //blog.chrisblunt.com/cocoa-bindings-and-nspopupbutton/说 NSPopupButton “NSPopUpButton 不记录用户的选择”,而是将您的选择存储在除阵列控制器。我尝试在我的窗口中放置一个 currentBar 属性并将选择绑定到该属性,尽管我可以看到 currentBar 正在更改(因为我也绑定了另一个视图),但弹出按钮中的标签没有更改。

如果有人可以帮助我,我将不胜感激。

4

1 回答 1

0

FooBar 的事情让我很困惑,所以这是我基于真实世界对象的示例。

ExpenseTransaction 具有属性(日期、trxDescription、类别、金额)。

类别有一个属性(名称)

ExpenseTransaction.category 是与 Category 的一对一关系(换句话说,交易只能属于一个 Category)。

Category.transactions 是与 ExpenseTransaction 的 To-Many 关系(换句话说,许多交易可以属于同一个 Category)。

用于创建新事务或编辑现有事务的 UI 使用 NSPopupButton 使用 name 属性显示可用类别的列表。对于现有交易,弹出窗口将显示选定的交易类别。

类别弹出窗口的绑定如下:

内容(Category.arrangedObjects)

内容对象(Category.arrangedObjects) - 我们要链接到实际类别而不是其名称,因为属性是关系而不是字符串值

内容值(Category.arrangedObjects.name) - 我们希望名称显示在弹出列表中

选定对象(ExpenseTransaction.selection.category)

使用您的 FooBar 类比:

Category 与 ExpenseTransaction 有关系,因此 Category 有一个属性(事务),它是 ExpenseTransactions 的 NSSet。现在这几乎与我的安排相反,所以我真的不知道如何或为什么用 ExpenseTransaction 对象填充弹出窗口,因为弹出窗口中只有一个选定的项目可能与 Category 对象相关,而实际上你需要整个设置为相关。然而,另一种方式工作得很好,因为弹出窗口将包含所有 Foo 项目的列表,因此每当您选择 Bar 项目时,可以从弹出窗口中选择相应的 Foo 项目。

希望这是有道理的。

于 2013-11-11T09:31:31.193 回答