2013-02-11 8 views
5

ビューベースのNSTableviewは、以前に生成された範囲外にスクロールされたTableCellViewを再利用しないようにしたいと思います。私はdequeueReusableCellWithIdentifier:を上書きしてnilを返すことで、これがUITableViewで可能になると考えています。私はNSTableView同様のソリューションですか?NSTableViewを再利用しないようにする方法TableCellViews

-

私の背景:私は(つまりテーブル内容、-selectionと-sortdescriptorがarraycontrollerとtableCellView要素にバインドされている通常の方法でManagedObjectsに結合している、非常に複雑なビューベース-のtableViewを持っていますobjectValueにバインドします)。

表には、約20列ありますが、最大400行です。スクロールは実際には遅いですが、時間プロファイリングは、単一の遅れの原因が存在しないことを示します(最大の単一メソッド呼び出しには約5%の時間がかかります)。私のManagedObjectの派生した/カスタムのプロパティをパフォーマンスを大幅に向上させることなくキャッシュした後、ビューがキャッシュに入れようとしています(ビューがスコープに入ったときにtablecellViewの頻繁な再バインドを避けるため)。

私は現時点ではテーブルコンテンツをバインドしないようにしていますが、NSDatasource-protocolを使用してビューを取得しています。そこに

-(NSView*) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 

私は存在する場合、キャッシュされたTableCellViewsを返したいと思います。そうでなければ私は

[self.table makeViewWithIdentifier:... owner:self]; 

を経由して新しいものを作成makeViewWithIdentifierはすでに私がキャッシュされているビューを返すことがありますので、テーブル・コンテンツが間違った細胞を台無しにされます。

パフォーマンスが...このアプローチで有意に良好

ある - よりパフォーマンススクロール作ることに

他のアイデアもにappriciatedされています。

+0

私はあなたがこれでどこにいても知っていることに興味があります。私は、私のNSTableViewが何らかの理由でセルを再使用していないという点で反対の問題があると思います。私はPXListViewを試しましたが、それはパフォーマンスが悪く、バグがたくさんあったので、NSTableViewに固執したいと思いますが、キャッシュビューを作成する方法を考えています。あなたの問題が解決する限り、各ビューの一意の識別子を作成することができますか、それとも恐ろしいメモリ使用を引き起こすでしょうか? – danpalmer

答えて

7

あなたのtableView:viewForTableColumn:実装では、返されたビューの.identifierをnilに設定します。これにより、テーブルにキャッシュされません。自分のキャッシュを管理することができます。 FWIWでは、makeViewWithIdentifierを使用する必要はありません。その方法を使用する代わりに手動でビューを手動で作成することができます(NIBからプレセットアップビューをロードする)。

ただし、パフォーマンスに問題がある場合は、遅い理由と理由を確認して対処する方がよいでしょう。あなたはなぜそれが遅いのかに関する情報を提供しなかったので、何をすべきかを言うのは難しいです。 20列はたくさんあります。 canDrawSubviewsIntoLayer、NSTableCellView、またはNSTableRowViewを使用してレイヤー数を減らすと、パフォーマンスが向上する場合があります。しかし、これを行うときに注意すべきことがたくさんあります。

コービン

+0

また、UIKitとdequeueReusableCellWithIdentifier:と同様に、makeViewWithIdentifierをオーバーライドして、独自のキャッシュメカニズムを実装することもできます(またはnilを返すこともできます)。 –

+0

tableView:viewForTableColumn:からのリターンは再利用プールのキャッシュにのみ使用されていると言っていますか?どのくらい多くのビューが非常に遅くなるか、または再利用プールの大きさを知る方法についての最新の情報はありますか?スクロールビューのオーバードローAPIにどのように結びついているかを知る方法はありますか? – uchuugaka

+1

いいえ、それは私が言ったことではありません。 tableView:viewForTableColumn:からの戻り値は、テーブルがその指定された場所に配置するビューです。ビューが削除されるとき(不要になったため)、view.identifierがnil以外の場合にのみキャッシュされます。それ以外の場合、ビューは投げ捨てられ、解放されます。 –

関連する問題