日々精進

新しく学んだことを書き留めていきます

UIViewControllerのインスタンス変数「view」を置き換えるとエラー

UIViewControllerはXIBファイルと1対1になるよう作るのが基本だと思うが、それだとXIBファイルが細切れになりすぎてわかりにくい。
例えば、UITableViewControllerを継承したMyTableViewControllerを作った場合、UITableViewController.xibはTableView一つだけになることが多い。
これよりは親ビューと同じXIBファイルにTableViewを入れた方がテーブルを配置しやすいし、画面のレイアウトがわかりやすいと思う。
よってUIViewControllerのインスタンス変数「view」にXIBファイル内で定義されたUIViewを代入したい。


これは普通に書くと以下のようになるが、うまくいかない。

- (void)viewDidLoad{
    [super viewDidLoad];

    self.tableViewController = [[UIViewController alloc] init];
    self.tableViewController.view = self.aTableView;
}

正しくはloadViewメソッドを定義してその中でviewに代入する。

- (UITableView *)view{
    return (UITableView *)[super view];
}

- (void)loadView {
    [super setView:self.tempView];
    self.tempView = nil;
}

- (id)initWithView:(UITableView *)view{
    if ((self = [super init])){
        self.tempView = view;
    }
    return self;
}

呼び出し側は以下。

        return [[UITableView alloc] initWithView:self.aTableView];

こうすると一つのXIBファイルに複数のUIViewControllerをひもづけることができる。