4


私はデザインの問題に苦しんでいます:私NSCollectionViewはいくつかのアイテムを含むを持っています(それNSArrayControllerはにバインドされ、次ににバインドされますNSManagedObjectContext)。NSView主に、コレクションビューに特定の数を超えるアイテムがある場合、アイテムビュー内に複数のアイテムをネストするとパフォーマンスの問題が発生することに気付いたため、プログラムで各アイテムのビューを描画することにしました。
次の階層を検討してください:NSCollectionView=> NSCollectionViewItem-> NSView。(によって使用されるデフォルトのものNSCollectionView)。私のカスタムNSViewにはいくつかのレイヤーが含まれています。いくつかはCATextLayersで、他は通常CALayerのsであり、必要なときにすべて一緒に(同じ内でCATransaction)アニメーション化します。ここでの問題は、それぞれがCALayer!を所有する...のrepresentedObjectプロパティを介してアクセスできるデータのコンテンツを表示する必要があります。私には2つのオプションがあります(おそらくもっとたくさん、私は提案を受け入れる以上のものです): -から をに複製し、プログラムの実行を通して一貫性を保ちます。私はこれが本当に好きではありません。-のs を公開し、のメソッド内からコンテンツ/文字列を設定します。(もちろん、レイヤーを通して表示されているものを除いて)に保存されたデータがないので、私はこれがより好きです。 私が間違っている?よりエレガントな解決策はありますか?NSCollectionViewItemNSView
representedObjectNSCollectionViewItemNSView
CALayerNSViewNSCollectionViewItemsetRepresentedObject:NSView

よろしくお願いします。乾杯

ジャン・マルコ

4

1 に答える 1

3

この質問にかなり遅れて出くわしました、そしてそれは面白いデザインの問題だと思いました。

これをクラックしていないか、どちらのソリューションも気に入らなかった場合:

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

NSCollectionViewItemはNSViewControllerであり、ビューの管理を担当する必要があることを意味します。モデルオブジェクトのユーザー向けの表現として、それが機能するビューレイヤーをそのrepresentedObjectプロパティに保持することで、これを尊重できます。したがって、KVOを使用してモデルの必要なすべてのプロパティを監視することにより、モデルの「レンダリング」に関するすべてのビュー操作を呼び出すための適切な場所が必要になります。NSViewAPIとCALayerAPIのどちらを使用するかについては、この目標到達プロセスで完全に制御できる必要があります。

プロトタイプアイテムビューの複雑さ、アイテムセットのサイズと揮発性、UIの「活気」要件、およびその他の要因に基づいて、モデルの非常に粗い観察で逃げることができる場合があります。または、非常にきめ細かいものが必要です-KVO APIの操作に慣れていただければ幸いです!

最終的にどのような選択をしたのかも聞きたいです。

于 2013-02-18T23:48:54.647 に答える