NSTableViewにNSTableCellViewを継承して作ったカスタムセルを表示する方法のメモ。
とりあえず2通りの方法があるようです。もしかしたらもっとあるのかもしれません。
- チュートリアルなどで、よく見かける方法。
- 正攻法(たぶん)。
チュートリアルなどで、よく見かける方法
NSTableViewDataSourceプロトコルのメソッドを実装します。
単純なテーブルを実装する場合によく見かけますが、
カスタムセルを使う際は使われていないようです。
func tableView(tableView: NSTableView!, objectValueForTableColumn tableColumn: NSTableColumn!, row: Int) -> AnyObject!
こちらでは、下記の動作になります。※推測含む
- メソッド内で自分でセルを作る(セルA)
- 内部的にセルが作られる(セルB)
- セルB のsetObjectValueに セルA が渡される
- セルA は破棄されて セルB が使われる
setObjectValueを実装していないとまっさらなセルが表示されます。
リファレンスに書いてあるんでしょうか、見つけられなくてすごくハマりました。
正攻法(たぶん)
NSTableViewDelegateプロトコルのメソッドを実装します。
1つ目の方法と似ていますが、プロトコルと第二引数と戻り値が違います。
func tableView(tableView: NSTableView!, viewForTableColumn tableColumn: NSTableColumn!, row: Int) -> NSView!
こちらでは、下記の動作になります。
- 関数内で自分でセルを作る(セルA)
- セルA がそのまま使われる
Web上で公開されているTipsなどではコチラがよく使われていますが、
私はしばらく違いに気づきませんでした。
まとめ
こういう時は引数名を確認↓
「コピペすると動くけど、手打ちだと(うっかり見慣れたメソッドを使ってしまって)動作が変わった」