UITableViewController は initWithStyle: で UITableView を作成する

2010年7月17日土曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

UITableViewController Class Reference

ものすごい勘違いをしていてハマった。記録に残しておく。

TableViewController.m
TableViewController.h
TableViewController.xib

を用意しておき、他のコントローラからこのコントローラを呼び出す。この時 -init を使う。
TableViewController *tableViewController =
    [[TableViewController alloc] init];
[self.navigationController pushViewController:tableViewController animated:YES];
[tableViewController release];

-initはこんな実装。
- (id)init
{
 if (self = [super initWithStyle:UITableViewStylePlain]) {
  :
  :
 }
 return self;
}

この場合、TableViewController.xib は使われない。なぜなら initWithStyle: を呼んだ場合、UITableViewController が UITableView を自動的に生成するから。普通に考えればわざわざ UITableViewStyle を引数に取っているので自明ではある..。

ずっと xib が使われているものだと思ってそのままにしていた。今回たまたま検索窓をつけようとしてこのことに気がついた。最初はなぜ xibの変更が反映されないのか焦ってしまった。


解決策は UIViewController の initWithNibName:bundle: を使うこと。
- (id)init
{
 if (self = [super initWithNibName:@"TableViewController" bundle:nil]) {
  :
  :
 }
 return self;
}

もしくは呼び出し側で initの代わりに使う。Xcodeが生成するテンプレートはこちらのスタイルになっている。
TableViewController *tableViewController =
    [[TableViewController alloc] initWithNibName:@"TableViewController" bundle:nil];
[self.navigationController pushViewController:tableViewController animated:YES];
[tableViewController release];

Responses

Leave a Response

人気の投稿(過去 30日間)