View-based なテーブルビューを扱う場合、テーブルビューの delegate の awakeFromNib
が複数回呼ばれるかもしれないことに注意。
典型的な状況は次のとおり。ある NIB が、 view-based なテーブルビューと、そのセルとなるビューを含んでいる。 NSTableView
の delegate
アウトレットに xib 内のあるオブジェクトが接続されている。さらに、セルビューをインスタンス化するとき、 owner に同じオブジェクトを指定している:
MyWindow.xib
|
|`-- NSTableView
| | `-- MyTableCellView
| | |
| | [delegate] | [owner]
| | |
| v v
`-- MyTableViewDelegate (may be File's Owner)
@implementation MyTableViewDelegate
- (NSView *)tableView:(NSTableView *)tableView
viewForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row {
// owner に self を指定して MyTableCellView を作成している
MyTableCellView *view = [tableView makeViewWithIdentifier:@"..."
owner:self];
...
}
以上の状況では、 NIB がロードされたときに加えて、 MyTableCellView
が NIB からインスタンス化されたときにも MyTableViewDelegate
の awakeFromNib
が呼ばれる。
これは、標準のビューをセルビューにしたい場合(つまり、標準のビューのサブクラスを作って awakeFromNib
を実装する手間をかけたくない場合)に、 owner がセルビューを初期化してやるための機構である。
よって、 owner の awakeFromNib
は複数回呼ばれても構わないようにする必要がある。この機構が不要なら、セルビューを作るとき makeViewWithIdentifer:owner:
の owner に nil
を渡せばよい。