2011-11-09 8 views
0

人は多くの車を所有しており、彼らは好きな車を持っていると言います。私は、ドキュメントビューでNSPopUpButtonCellをテーブルビューに配置する正しい方法について、各行ごとに異なる方法で記述しているようです。NSTableViewDataSourceを使用してNSPopUpButtonCellを適切に埋め込む方法

たとえば、1人の人が1行で、お気に入りの車の列にはNSPopUpButtonCellがあります。各行には異なるメニュー項目があります。 NSTableColumn.hから行1(カマ、キャバリエ、F150)行2(745li、カマロ、タウン車)等...

+0

バインディングを見ましたか? – jrturton

+0

ええ、バインディングを使用しています。私は、多くのデータがある場合、手動のデータソースを好む。 – joels

+0

私はまた、各行のメニューの配列を保存しようとしました。この方法では、セルのメニューを設定するたびに、各行のメニューを再作成する必要はありません。それでもまだ遅いです。 – joels

答えて

1

をファイルには、このために使用されるセルの行単位のカスタマイズが可能NSTableColumn。 NSTableViewは 'row'を描画するときに - [tableColumn dataCellForRow:]を呼び出します。デフォルトでは、これは単に-dataCellを呼び出します。サブクラスは、異なる行に異なるセルを使用する必要がある場合は、-dataCellForRow:をオーバーライドできます。 Leopard以上では、NSTableViewデリゲートメソッド-tableView:dataCellForTableColumn:row:をNSTableColumnのサブクラス化を回避するための喜びとして使用できます。どちらの場合でも、NSTableViewはセルのコピーを作成する可能性があるため、返されるセルは-copyWithZone:を正しく実装する必要があります。

テーブルは、ポップアップセルでselectedIndexのデータソースを尋ねると、デリゲートにメニュー項目を要求します。私は、私の代理人とデータソースを同じオブジェクトと呼び、それをtableViewControllerと呼ぶことができます。

tableViewControllerがobjectValueForTableColumn :(データソースメソッド)でselectedIndexを提供しているとき、そのメニューにすべてのメニュー時間が含まれていないため、dataCellForRowを呼び出して選択したメニューおよびインデックスを取得する必要がありますメニューの項目をクリックします。
tableViewControllerはdataCellForRow:を実装し、新しいNSPopUpButtonCellを作成し、それにメニューアイテムを設定します。

これは機能しますが、複雑です。

関連する問題