我正在努力解决设计问题:我有NSCollectionView
包含多个项目(它绑定到NSArrayController
,而后者绑定到NSManagedObjectContext
。我已经决定以编程方式为每个单独的项目绘制视图,主要是因为我注意到在项目视图中嵌套多个NSView
会在集合视图中有超过一定数量的项目时产生性能问题。 />
请考虑以下层次结构:NSCollectionView
=> NSCollectionViewItem
- > NSView
。 (NSCollectionView
使用的默认值)。
我的自定义NSView
包含多个图层,其中一些是CATextLayer
个,其他图层是常规CALayer
,并且只要需要,它们就会一起动画(在同一个CATransaction
内)。这里的问题是每个CALayer
需要显示一些数据的内容,这些数据可以通过representedObject
拥有NSCollectionViewItem
的{{1}}属性访问!
我有两个选择(可能更多,我不仅仅对建议持开放态度):
- 我将NSView
从representedObject
复制到NSCollectionViewItem
,并且在程序执行过程中保持一致。我真的不喜欢这个。
- 我在NSView
中公开了CALayer
,并在NSView
的{{1}}方法中设置了内容/字符串。我更喜欢这个,因为NSCollectionViewItem
中没有保存数据(当然,通过图层显示的数据除外)。
我错了吗?有更优雅的解决方案吗?
在此先感谢,我真的很感激帮助。 干杯
吉安·马可答案 0 :(得分:3)
很晚才遇到这个问题,我认为这是一个有趣的设计问题。
如果你没有破解这个或者不喜欢你的任何一个解决方案:
我建议编写一个观察self.representedObject键路径的NSCollectionViewItem子类,并在模型对象更改时刷新其视图和子视图。
NSCollectionViewItem是一个NSViewController,这意味着它应该负责管理它的视图。您可以通过使其所使用的视图层作为其模型对象的面向用户的表示形式来保持其RepresentObject属性。因此,通过使用KVO观察模型的所有必要属性,您应该有一个整洁的位置来调用有关“渲染”模型的所有视图操作。对于您是否要使用NSView API或CALayer API,您应该完全控制此漏斗。
根据您的原型项目视图的复杂程度,项目集的大小和波动性,用户界面的“活跃度”要求以及其他因素,您可能能够通过粗略观察模型,或需要一个非常细粒度的模型 - 我希望你习惯使用KVO API!
我也很想听听你最终做出的选择。