2012-02-22 3 views
2

NSTableViewは、NSCell(間接的にはNSTableColumn経由)の倍数を持ちます。 NSCellはFlyweightのデザインパターンに従います。彼らはクッキーカッターです。 1列に1つのセルがあり、それは各行ごとに描画するように求められます。 "値は1行目に描画し、2行目などには値を設定します。これは、セルごとのビューインスタンスを持つビューベースのテーブルビューとは対照的です。setObjectValue:nilだけが呼び出されたときにNSPopUpButtonCellが正しく表示されるのはなぜですか?

NSPopUpButtonCellをサブクラス化し、setXxxValue:メソッドごとに、NSLog();を呼び出し、メッセージをスーパークラスに転送します。呼び出される(たとえば、新しい行を追加するときやテーブルを更新するときなど)唯一のメソッドはsetObjectValue:です。これはdocumentationから期待されていますが、nullはそれに渡される唯一のものです!選択されたアイテムインデックスを持つNSNumberが渡される必要があります。

テーブルが正常に描画されます。私はこれを理解しようとしています。なぜなら、セルの振る舞いを拡張/変更したいからです(明らかにそうでなければ、サブクラスを必要としないためです)。

質問:これはどのように可能ですか?各行に適切な値を描画するために、NSPopUpButtonCellを値に設定する方法。バインディングを考慮しても、NSTableColumnは重い持ち上げをしていますか?私は何が欠けていますか?

+0

同じです:カスタム 'NSPopUpButtonCell'サブクラスで、メニュー項目を変更する必要があります。' setObjectValue: 'はすべてnilで呼び出されます。これ以上の洞察はありますか? – Jay

答えて

0

「テーブルのすべての行は同じポップアップメニューを共有します」 - そうである必要はありません。

テーブルの値バインディングを設定することに加えて、セルのコンテンツバインディングを、アレイコントローラを介してモデルオブジェクトの配列プロパティに設定します。

モデルのオプションを決定するコードを保持できます(文字列の配列を作成するだけです)。そうすれば、カスタムサブクラスは必要ありません。

+0

1)私はあなたが行ごとにメニュー内の異なる項目を持つことができることに同意します...しかし、それはまだ同じNSMenuのインスタンスです。行ごとに 'setMenu:'を呼び出すと、私にとっては無駄に思えます。 2)私は、あなたが細胞の束縛を必要としている(またはそうするべきではない)と信じていません。 NSTableColumnはそれを処理します(カスタムバインディングがない場合)。 –

+0

「setMenuを呼び出す」という意味はわかりませんが、バインディングが各行のメニューを設定していない限り、私は知っています。メニューが実際に表示されるときにのみ設定されます。 – paulmelnikow

関連する問題