1

问题

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

我试图以多种方式实现这一点,但总是遇到一些使解决方案复杂化的事情。实现这一点的最佳方法是什么?

数据在这里由 Core Data 管理,因此集合是NSSets。我尝试在父级中添加一个转换方法来返回一个排序的NSArray(以便将它与 绑定NSArrayController)但是这种方法会阻止 KVO 并且数组控制器没有正确更新。

先感谢您。

一个例子

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

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

4

2 回答 2

3

在没有委托/数据源设置的情况下,有一个解决方案。

我的上下文是这样的:

  • CoreData与父母和孩子的模型,一个父母通过名为孩子的关系有多个孩子。两者都有一个属性name
  • 这两个实体必须作为类可用(每个都有 a.m和 a .h)。(如果您转到 File-New-File-CoreData-NSManagedObjectSubclass,Xcode 将为您编写它们。) 现在 ParentObject.children 可以访问 ParentObject 的 ChildObjects
  • NSArrayControllersParentArrayControllerChildArrayController
  • 两个NSTableViewsParentTableChildTable,每个都有一列name。(使用 Popup 或 table 无关紧要,只要它由. 控制即可NSArrayController。)

采取的步骤如下:

  • 像往常一样将两个 NSArrayControllers 连接到 ManagedObjectContext 并将它们设置为 Mode:Entity Name与它们各自的实体(父或子)
  • 像往常一样将两个 TableView(它们的列)绑定到它们的 NSArrayController。
  • Now comes the magic: In the ChildArrayControllers binding section under ControllerContent-ContentSet bind to the ParentArrayController with ControllerKey: selection and ModelKeyPath: children.

Done. If you select a ParentObject in the ParentTable the ChildTable shows its children.

To add and remove children to parents you can use the (void)addChildrenObject:(Child *)value; method that Xcode wrote for you in the Parents.m class file.

于 2012-08-03T16:16:46.713 回答
0

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

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

于 2011-03-25T21:48:52.880 回答