4


我正在为一个设计问题而苦苦挣扎:我有一个NSCollectionView包含多个项目的 an (它绑定到 an NSArrayController,而后者又绑定到 a NSManagedObjectContext)。我决定以编程方式为每个单个项目绘制视图,主要是因为我注意到NSView当集合视图中有超过一定数量的项目时,在 Item View 中嵌套几个 s 会产生性能问题。
考虑以下层次结构:NSCollectionView=> NSCollectionViewItem-> NSView。(由 使用的默认值NSCollectionView)。我的自定义NSView包含几个层,一些是CATextLayers,另一些是常规s,并且它们都在需要时CALayer一起(在同一个)动画。CATransaction这里的问题是每个CALayer需要显示一些数据的内容,这些数据可以通过...的representedObject属性访问NSCollectionViewItem,它拥有NSView!我有两个选择(可能更多,我对建议持开放态度): - 我将from
复制到 its ,并在程序执行过程中保持一致。我不是很喜欢这个。 - 我在 s 中公开s ,并在's方法中设置它们的内容/字符串。我更喜欢这个,因为其中没有保存数据(当然,通过图层显示的数据除外)。 我错了吗?有没有更优雅的解决方案?representedObjectNSCollectionViewItemNSView
CALayerNSViewNSCollectionViewItemsetRepresentedObject:NSView

在此先感谢,我真的很感谢您的帮助。干杯

吉安·马可

4

1 回答 1

3

很晚才遇到这个问题,我认为这是一个有趣的设计问题。

如果你还没有破解这个或者不喜欢你的任何一个解决方案:

我建议编写一个 NSCollectionViewItem 子类来观察 self.representedObject 键路径,并在模型对象更改时刷新其视图和子视图。

NSCollectionViewItem 是一个 NSViewController,这意味着它应该负责管理它的视图。您可以通过将其使用的视图层作为其模型对象的面向用户的表示形式保存在其代表对象属性中来尊重这一点。因此,通过使用 KVO 查看模型的所有必要属性,您应该有一个整洁的位置来调用与“渲染”模型有关的所有视图操作。您应该在此漏斗中完全控制您是否希望使用 NSView API 或 CALayer API。

根据您的原型项目视图的复杂程度、项目集的大小和波动性、UI 的“活力”要求以及其他因素,您可能能够对模型进行非常粗粒度的观察,或者需要一个非常细粒度的——我希望你已经习惯了使用 KVO API!

我也很想知道你最后做了什么选择。

于 2013-02-18T23:48:54.647 回答