デザインの問題:Core Animation、NSCollectionView、NSCollectionViewItems


I am struggling with a design issue: I have an NSCollectionView that contains several items (it's binded to an NSArrayController which is, in turn, binded to a NSManagedObjectContext). I have decided to draw the view for each single item programmatically, mainly because I noticed that nesting several NSViews inside the Item View creates performance issues when there are more than a certain number of items in the collection view.
Consider the following hierarchy: NSCollectionView => NSCollectionViewItem -> NSView. (The default one used by NSCollectionView). My custom NSView contains several layers, some are CATextLayers, others are regular CALayers, and they all animate together (within the same CATransaction) whenever they need to. The issue here is that each CALayer needs to display the content of some data which is accessible through the representedObject property of the NSCollectionViewItem... which owns the NSView! I have two options (probably many more, I'm more than open to suggestions):
- I replicate the representedObject from the NSCollectionViewItem to its NSView, and I keep it consistent througout the execution of the program. I don't really like this one.
- I expose the CALayers in the NSView, and I set their content/string from within the NSCollectionViewItem's setRepresentedObject: method. I like this one better, because there is no data saved in the NSView (except for that which is being shown by through the layers, of course).
Am I wrong? Is there a more elegant solution?

事前にありがとう、私は本当に助けを感謝します。 乾杯

ジャンマルコ

4
非常に良い質問ですが、私はそれほど適切な答えを知っている人はほとんどいません。 1つの質問.. CALayer はどこで設定しますか?以前にView-hosted要素を NSArrayController に追加する前に、同じことをやろうとしています。 NSView CALayer の間の精神的なギャップは広大ですが、私はアニメーションAPIをかなり簡単に保つためにリンゴのクレジットを与えています。
追加された 著者 Alex Gray,

1 答え

この質問にはかなり遅れて来て、面白いデザイン問題だと思った。

あなたがこれを分解しなかった場合、またはいずれかのソリューションが嫌いな場合:

私は、self.representedObjectキーのパスを観察し、モデルオブジェクトが変更されたときにビューとサブビューを更新するNSCollectionViewItemサブクラスを作成することをお勧めします。

NSCollectionViewItemはNSViewControllerで、ビューの管理を担当する必要があります。あなたは、それが動作するビューレイヤーを、そのモデルオブジェクトのユーザ向きの表現として、そのrepresentObjectプロパティに保持させることによって、それを尊重することができます。したがって、KVOを使用してモデルの必要なすべてのプロパティを見ることで、モデルのレンダリングに関するすべてのビュー操作を呼び出すためのすっきりした場所を用意する必要があります。 NSView APIまたはCALayer APIを使用するかどうかは、このファネルで完全に制御する必要があります。

あなたのプロトタイプアイテムビューがどれほど複雑であるか、アイテムセットのサイズとボラティリティ、UIの「活気のある」要件、およびその他の要因に基づいて、モデルの非常に粗い観察で逃げることができるかもしれませんが、非常にきめ細かなものが必要です - 私はあなたがKVO APIの作業に慣れたことを願っています!

私はまたあなたが最後に何をしたのか聞きたいと思っています。

3
追加された
まあ、あなたの提案された解決策は確かに面白いです。当時私はKVOを一度も使ったことはありませんでしたが、私が提案したものよりもはるかに上品な解決策だったと思います。最終的には、私は本当にNScollectionView、カスタムセルを持つNSTableViewだけを必要としなかったので、何とかすべてをやっていました。私は、基本的に、車輪を再発明していた、それは決して良いことではありません。 :)
追加された 著者 juandemarco,