NSTableView内容基于另一个NSArrayController的选择

时间:2011-03-24 20:40:49

标签: core-data nsarraycontroller nspopupbutton

问题

我有一个绑定到NSPopUpButton的弹出按钮(NSArrayController)。此数组控制器处理父对象,每个父对象都有一个子对象集合。我有一个NSTableView,我需要在弹出窗口中显示这些孩子的所选项目。此外,需要操纵子项列表(添加/删除)。

我试图以多种方式实现这一目标,但总会遇到一些使解决方案复杂化的问题。实现这个的最佳方法是什么?

数据由Core Data管理,因此集合为NSSet。我已尝试在父级中添加转换方法以返回已排序的NSArray(以便将其与NSArrayController绑定)但这种方法可防止KVO和阵列控制器未正确更新。

提前谢谢。

示例

澄清一下,这是一个假设的例子:

假设我有一份在其他地方维护的国家/地区列表。在弹出按钮中选择其中一个国家/地区。每个国家都有一组城市。选择国家/地区后,表格视图将由其城市填充。

2 个答案:

答案 0 :(得分:3)

没有代理/数据源设置,有一个解决方案。

我的背景是:

  • CoreData模型与父母和孩子,一个家长有多个孩子通过一个名为孩子的关系。两者都有一个属性name
  • 这两个实体必须作为类提供(每个实体都有.m.h)。 (如果你去File-New-File-CoreData-NSManagedObjectSubclass,Xcode会为你编写它们。)现在ParentObject.children可以访问ParentObject的ChildObjects
  • 两个NSArrayControllersParentArrayControllerChildArrayController
  • 两个NSTableViewsParentTableChildTable,每个name都有一列。 (只要它由NSArrayController控制,无论你使用弹出窗口还是表格都无关紧要。)

采取的步骤如下:

  • 像往常一样将两个NSArrayControllers连接到MangagedObjectContext并将它们设置为模式:Entity Name及其各自的实体(父或子)
  • 像往常一样将两个TableView(它们的列)绑定到NSArrayController。
  • 现在来了魔术:在ControllerContent-ContentSet下的ChildArrayController绑定部分中,使用ControllerKey绑定到ParentArrayControllerselection和ModelKeyPath:children

完成。如果在ParentTable中选择ParentObject,则ChildTable会显示其子项。

要向父母添加和删除子项,您可以使用Xcode在(void)addChildrenObject:(Child *)value;类文件中为您编写的Parents.m方法。

答案 1 :(得分:0)

我没有找到任何方法通过简单的拖放来实现它。我必须为城市表实现委托和数据源(来自示例)。窗口控制器会在弹出按钮中通知选择更改,这会更新表视图委托/数据源上的内容。

我实际上觉得这是实现问题的更好方法(比绑定和数组控制器更好),因为它可以更好地控制特殊情况。