2011-06-27 40 views
1

我有一个示例应用程序,我正在帮助我了解Core Data。在这个应用程序中,我创建了一个由实体“朋友”和“城市”组成的模型。应用程序列出我的朋友以及他们来自哪个城市的NSTableView。在这个表格视图中,我希望城市列是一个带有城市列表的NSComboBoxCell。我得到了这么多...现在的问题:

当我从组合框中选择城市时,应用程序将采用所选城市名称的值,并将其应用于朋友当前所在城市的名称。相反,我希望应用程序能够真正改变用户来自的城市,而不是城市的名称......这有点令人困惑的问题,所以这里是一个例子:从一个朋友列表开始,如如何使用NSComboBoxCell,NSTableView和核心数据设置关系

 
Andy  Asheville 
Francois Montreal 
Jeff  Asheville 

如果我使用NSComboBoxCell改变城市安迪从阿什维尔飞往蒙特利尔,应用程序实际上改变了城市阿什维尔蒙特利尔的名称,所以结果是这样的:

 
Andy  Montreal 
Francois Montreal 
Jeff  Montreal 

还有两个不同在申请中的城市,但他们现在都有蒙特利尔的名字。

考虑到我设置绑定的方式,这一切对我来说都有意义。我通过将模型关键路径设置为“city.name”并将Controller Key设置为包含好友列表的Objects对象来约束城市表列的值。所以当然,当一个单元格的值发生变化时,它会修改city.name。那么我的问题就变成了什么才能做到这一点,以便城市改变而不是城市名称?

回答

3

NSComboBox的目的是“允许您直接输入文本(就像使用NSTextField一样)或(...)从显示的项目列表中选择”。 (取自Apple Cocoa Ref)。

所以组合框是一个荣耀的NSTextField。您期望的行为更符合NSPopupButton。

正如你提到的,NSComboBox绑定改变当前城市的名称值,但不改变对象的关系,因此他们改变由关系代表(目前我市然后把它“传播”到其他的名字指向同一城市实体的朋友)。

如果您查看NSPopupButton的可用绑定,您将看到不同之处。您可能希望使用NSPopupButton(单元格)将城市分配给朋友,并使用某种“旁边的”基于NSTableView的编辑器来管理您的城市名称 - 这实际上是两项截然不同的任务。

+0

太好了,谢谢!我做到了,事情很好。如果用户可以输入城市名称而不是用鼠标选择它,那将会很好。系统可以使用诸如自动完成之类的东西。 – Jason

+0

那么,在这一点上,我们正在摆脱原来的问题和设计问题,但你可以回到NSComboBox并调查[完成函数](http://developer.apple.com/library/mac/#文档/ Cocoa/Reference/ApplicationKit/Classes/NSComboBoxCell_Class/Reference/Reference.html%23 // apple_ref/doc/uid/20000098-BAJEAFCB),但这将需要代码。还有一个有趣的讨论[这里](http://lists.apple.com/archives/cocoa-dev/2006/Jun/msg00459.html)。 – burton