7

Xcode 3 がビルド構成に使用しているようなアウトライン ビューをどのように実装するのか疑問に思っています。

代替テキスト

NSOutlineView/NSTableView をバインドおよび NSTreeController/NSArrayController と共に使用する場合、明らかな理由により、ビューの列は個々のセルではなく に割り当てられたバインドを取得します。列のすべての行が同じセルを使用している場合は、簡単です。ただし、すべての行が (潜在的に) 独自のセル型を使用している場合(そして、潜在的に独自のバインディングのコレクションを使用している場合) は、おかしなことになります。

スクリーンショットを見ると、テキスト フィールド セルに必要な「値」のバインドが 1 つだけであることがはっきりとわかります。ポップアップ ボタン セルには、「content」に少なくとも 1 つ、「contentValues 」に 1 つ、最後に「 selectedIndex / selectedObject / selectedValue 」に少なくとも 1 つのバインディングが必要です。チェックボックスのセルには、" value " と (おそらく) " title "のバインドが必要です。

できるだけきれいな (そして少ない) コードでこれを達成するにはどうすればよいでしょうか?
(または、次のように尋ねられるかもしれません: Apple はどのようにそれを行ったでしょうか?)

[ outlineView :dataCellForTableColumn:item:]
を 介して適切な (コピーされた) セルを提供し、それらを個々のデータ モデル ([item presentedObject] から) にバインドします。アウトライン ビューに表示されるデータの正確な量 (< 500 行) を知っているので、行ごとに 1 つのセルを使用しても、メモリの問題は大きくないはずです。バインディングを介して適切に表示されるデータを取得しました(イェーイ!) が、それらの値を変更することはできません。O_o どうやら、値の変更がデータ モデルに到達することはありません。単純な[checkboxCell bind:@"value" toObject:rowModel withKeyPath:@"value" options:nil]以上のものはありますか? (これは取得するのに十分なようです値を設定しますが、それに応じて設定するためのものではありません)。

このトピックに関する情報は見つかりませんでした。カスタムセルを列ごとに使用するための情報とヒントはたくさんありますが、「行ごと」に使用するためのものはありません。:(
これは、Cocoa チュートリアルの素晴らしい内容になると思いませんか? ;)

4

1 に答える 1

3

列のデータ セルはコピーされません。セルは、各行の列の適切な値に対して構成され、適切な場所に描画されます。フックするのに適した場所は、NSTableColumn メソッド-dataCellForRow:です。カスタム サブクラスでは、このメソッドをオーバーライドして、通常の操作用に -dataCell を渡すか、別のセル タイプを渡すことができます。

子 (非ルート項目) に対してのみ表示されるアウトライン ビューに「含める」を表すチェックボックス列を表示する機会がありました。ルート アイテムを除外することはできず、その子のみを除外することはできませんでした。そのため、非ルート アイテムのチェックボックスのみを表示することは理にかなっています。

デリゲート (データ ソース コントローラー) を受け取るカスタム NSTableColumn サブクラスを作成し、セレクター -deadCellColumn:shouldShowDeadCellForRow: に応答するかどうかを確認しました。もしそうなら、私はそのメソッド (私のデータ ソース コントローラーに実装されていた) を呼び出して、「デッド セル」 (何も描画しない基本的な NSCell サブクラス) を表示するかどうかを尋ね、答えに従ってそれを交換しました。デリゲートがセレクターに応答しなかった場合、テーブル列は通常の -dataCell を返します。

カスタム セル (「DeadCell」と呼んでいます) が必要だったのは、何も描画されず、何も編集できないようにしたかったからです。厳密に必要かどうかはわかりませんが、とにかく実行しました。これはあなたの場合にはあまり役に立ちませんが、完全を期すためにとにかく述べたいと思いました。

特に Bindings が関係しているため、状況はもう少し複雑です (また、異なるデータ セル タイプは値に対して異なるバインディングを持つことができます。ポップアップは特に困難な場合があります)。私の場合、実証済みのデータ ソース メカニズムのバインドを避けました。物事を大幅に簡素化しました。:-) あなたの場合、データ ソース メソッドを使用してセル タイプを交換するのは簡単です。

于 2010-08-01T19:16:38.873 に答える