Cocoa绑定用于分层模型

时间:2014-06-15 10:05:02

标签: cocoa cocoa-bindings key-value-observing

我有一个基于NSCollectionView的主从细节界面, 我想在主页中显示板子,在详细视图中显示列表+卡片。

Board,拥有List类型的NSMutableArray属性lists List,持有卡片类型的NSArray属性cards CardNSString属性name

因此,这种关系是董事会 - > to-many List - >多卡?

主界面很好。

详细信息界面会填充相应的列表标题 对于董事会。在详细信息界面中,我还想用一个NSPopupButton填充 每张清单的卡片。

问题:NSPopupButton为空。

Output: [<__NSArrayI 0x60000007b240> addObserver:forKeyPath:options:context:] is not supported. Key path: name

因此,在阅读KVO,KVC和Bindings文档后,我不确定是否需要为这种分层模型进行手动KVO。此外,输出提示name属性不符合KVC / KVO,但它只是一个NSString?

你建议使用NSTreeController吗?

绑定设置如下:

BoardArrayController - &gt;绑定到文件的所有者

  • **模型关键路径:board

ListArrayController - &gt;绑定到BoardArrayController

  • **控制器键:arrangeObjects
  • **模型关键路径:列表
  • **模式:班级

CardArrayController - &gt;绑定到ListArrayController

  • **控制器键:排列对象
  • **型号关键路径:卡片
  • **模式:班级

NSPopupButton有

  • 内容的控制器键:arrangeObjects
  • 内容值的控制器键:arrangeObjects和模型键路径:name

建议

2 个答案:

答案 0 :(得分:1)

如果我理解正确,在主界面中,用户选择一个Board。然后,详细界面应显示所选的Board列表。如果是,则ListArrayController应绑定到BoardArrayController,控制器密钥 selection (不是arrangedObjects),模型密钥路径lists

同样,CardArrayController应绑定到ListArrayController,控制器密钥selection,模型密钥路径cards。虽然我不清楚用户是否必须首先选择一个列表,然后看到带有该列表卡的弹出窗口,或者第二个集合视图中的每个项目中是否存在弹出窗口。如果是这种情况,那么每个项目都需要一个单独的数组控制器,如果项目视图位于单独的NIB中,这是最简单的。

答案 1 :(得分:1)

如果集合视图中的每个视图项的每个list都是representedObject,那么您可以使用readonly NSArray属性填充每个popupButton,该属性取决于cards数组在每个list中。在List类中添加arrangecards作为属性。

- (NSArray *)arrangedCards
{
    return [[self valueForKey:@"cards"] sortedArrayUsingDescriptors:
      [self arrangedCardsSortDescriptors]];
} 

使用弹出窗口所需的排序。这由name安排。

- (NSArray *)arrangedCardsSortDescriptors
{
    NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:
      @"name" ascending:YES];
    return @[sortByName];
}

将弹出窗口的内容绑定到NSCollectionViewItem。

模型关键路径为representedObject.arrangedCards

使用representedObject.arrangedCards.name作为内容值。