NSTableViewのcustomCell
NSTableViewのセルについてかなり悩まされたのでメモしておく。
まず、Cocoa Touchと同様に
- NSTableViewDataSource
- NSTableViewDelegate
の2つのプロトコルがある。
Cocoa TouchではreuseIdentifierを使ってcellのインスタンスを再利用するようになっているが、CocoaではNSTableColumnにsetDataCell:したcellを再利用するようになる。
#pragma mark NSTableViewDataDelegate - (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { return [tableColumn dataCell]; }
注意したいのが、NSTableViewの各カラムで使用されるセルは再利用されるということ。つまり同じインスタンスを使い回している。
NSTextFieldCellやNSImageCellなどのtextやimageは列と行に対応したobjectValueをセットしてやる。
イメージやテキストを含んだcell(NSCell)はInterfaceBuilderで作れない。
NSCellを継承したCustomCellクラスを作りコードでtextやimageを描画してやる必要がある。また、cellはobjectValueを1つしか受け取れない。
- (id)tableView:objectValueForTableColumn:row:
id型で返すことになるのでAlbumオブジェクトのようなtitle, song等を含むオブジェクトを返してやる。
あとはCustomCellクラスでAlbunオブジェクトの情報を描画してやればいい。
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
こんな感じ。