我有一个基于NSCollectionView的主从细节界面, 我想在主页中显示板子,在详细视图中显示列表+卡片。
Board
,拥有List类型的NSMutableArray
属性lists
List
,持有卡片类型的NSArray
属性cards
Card
,NSString
属性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;绑定到文件的所有者
ListArrayController - &gt;绑定到BoardArrayController
CardArrayController - &gt;绑定到ListArrayController
NSPopupButton有
建议
答案 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
作为内容值。