【问题标题】:Cocoa Bindings for hierarchical model分层模型的 Cocoa 绑定
【发布时间】:2014-08-05 09:12:01
【问题描述】:

我有一个基于 NSCollectionView 的主从界面, 我想在主视图中显示 Boards,在详细视图中显示 Lists+Cards。

Board,拥有 List 类型的 NSMutableArray 属性 lists List,拥有一个 Card 类型的 NSArray 属性 cards Card,有一个NSString 属性name

因此关系是 Board --> to-many List --> to-many Card

主界面很好。

详细界面会填充相应列表的标题 为董事会。在详细界面中,我还想用 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 -> 绑定到文件的所有者

  • ** 模型键路径:板

ListArrayController -> 绑定到 BoardArrayController

  • ** 控制器键:排列对象
  • ** 模型键路径:列表
  • ** 模式:类

CardArrayController -> 绑定到 ListArrayController

  • ** 控制器键:排列对象
  • ** 模型密钥路径:卡片
  • ** 模式:类

NSPopupButton 有

  • 内容的控制器键:排列对象
  • 内容值的控制器键:排列对象和模型键路径:名称

请提出建议

【问题讨论】:

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


    【解决方案1】:

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

    - (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 作为内容值。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 列表名称及其卡片直接显示在详细视图中。为什么我必须使用selection 而不是排列对象?
      • 您的修改与 NSCollectionViewItem 中的 @mikeD 结合使用。现在尝试应用相同的内容并填充 NSTableColumn 的内容,但它不起作用。相反,如果我使用 CardArrayController 和 Controller Key: selection 和 M.K.P 名称,我可以选择行,但它们不包含任何文本。
      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多