LoginSignup
8
9

More than 5 years have passed since last update.

View-based table view の delegate の awakeFromNib が複数回呼ばれる問題

Last updated at Posted at 2013-04-21

View-based なテーブルビューを扱う場合、テーブルビューの delegate の awakeFromNib が複数回呼ばれるかもしれないことに注意。

典型的な状況は次のとおり。ある NIB が、 view-based なテーブルビューと、そのセルとなるビューを含んでいる。 NSTableViewdelegate アウトレットに 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 からインスタンス化されたときにも MyTableViewDelegateawakeFromNib が呼ばれる。

これは、標準のビューをセルビューにしたい場合(つまり、標準のビューのサブクラスを作って awakeFromNib を実装する手間をかけたくない場合)に、 owner がセルビューを初期化してやるための機構である。

よって、 owner の awakeFromNib は複数回呼ばれても構わないようにする必要がある。この機構が不要なら、セルビューを作るとき makeViewWithIdentifer:owner: の owner に nil を渡せばよい。

8
9
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9