ものすごい勘違いをしていてハマった。記録に残しておく。
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