似乎有很多关于绑定NSPopupButton的问题,所以我觉得在这方面苦苦挣扎要好一点,但似乎没有一个能解决我的问题。
我有一个与另一个类有一对多关系的NSManagedObject子类。假设Foo与Bar有关系,所以Foo有一个属于NSSet of Bars的属性。
我创建了一个NSArrayController并将其contentSet绑定到Foo对象和'bars'键路径。
然后我将NSPopupButton的内容绑定到数组控制器的arrangeObjects及其contentValues到数组控制器的arrangeObject(控制器键)和'name'(我想要显示的Bar上的属性)。
到目前为止一切正常,但是当我尝试将NSPopupButton的选定对象绑定到数组控制器的选择时,NSPopupButton显示“< _NSArrayControllerObjectProxy”。我还尝试添加'name'作为此绑定的keyPath,这确实使NSPopupButton正确显示名称,但是当我更改弹出窗口中的选择时,应用程序抛出异常:
Unacceptable type of value for attribute: property = "name"; desired type = NSString; given type = Bar;
我想这是有道理的,因为弹出窗口试图将'name'的字符串值设置为选定的Bar。我认为我需要绑定一个选定的对象和一个选定的值,但如果我有一个选定的对象集,XIB将禁用所选的值。
我也尝试绑定所选的值,而这一半工作(数组控制器的选择确实发生了变化),但是弹出菜单中的选项不会改变以显示取消选择的那个并隐藏新选择的选项。
我没有阅读所有这些内容,我在这里阅读了一篇文章:http://blog.chrisblunt.com/cocoa-bindings-and-nspopupbutton/说NSPopupButton“NSPopUpButton不记录用户的选择”,而是将选择存储在除阵列控制器之外的其他位置。我尝试在我的窗口中放置一个currentBar属性,然后将选择绑定到那个,虽然我可以看到currentBar正在改变(因为我还有另一个绑定视图),弹出按钮中的标签不会改变。
如果有人能帮助我,我会非常感激。
答案 0 :(得分:0)
FooBar让我很困惑,所以这里是基于真实世界物体的例子。
ExpenseTransaction具有属性(日期,trxDescription,类别,金额)。
类别有一个属性(名称)
ExpenseTransaction.category是与类别的To-One关系(换句话说,一个事务只能属于一个类别)。
Category.transactions是与ExpenseTransaction的To-Many关系(换句话说,许多交易可以属于同一类别)。
用于创建新事务或编辑和现有事务的UI使用NSPopupButton来使用name属性显示可用类别列表。对于现有交易,弹出窗口将显示所选交易类别。
“类别”弹出窗口的绑定如下:
内容(Category.arrangedObjects)
内容对象(Category.arrangedObjects) - 我们希望链接到实际类别而不是其名称,因为属性是关系而不是字符串值
内容值(Category.arrangedObjects.name) - 我们希望名称显示在弹出列表中
所选对象(ExpenseTransaction.selection.category)
使用您的FooBar类比:
类别与ExpenseTransaction有关系,因此Category有一个属性(事务),它是ExpenseTransactions的NSSet。现在这几乎与我的安排相反,所以我真的不知道如何或为什么用ExpenseTransaction对象填充弹出窗口,因为弹出窗口中只有一个选定的项目可能与Category对象相关,而实际上你需要整个设置为相关。然而另一种方式工作得很好,因为弹出窗口将包含所有Foo项目的列表,因此每当您选择一个Bar项目时,可以从弹出窗口中选择相应的Foo项目。
希望这是有道理的。