基本的に、splitViewController には 2 つの MasterViewControllers がありますが、一度に 1 つのみでアプリを実行できます。両方の MasterViewControllers が同じ DetailViewController を使用しています。ユーザーがタブバーボタンを押すと、2 番目の masterViewController がプッシュされます。
splitViewController は、AppDelegate で次のように簡単に宣言されます
MasterViewControllerOne *mvc1 = [[MasterViewControllerOne alloc] initWithNibName:@"MasterViewControllerOne_iPad" bundle:nil];
UINavigationController *masterOneNavigationController = [[UINavigationController alloc] initWithRootViewController:mvc1];
DetailViewController *dvc = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil];
UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:dvc];
self.splitViewController = [[UISplitViewController alloc] init];
self.splitViewController.delegate = detailViewController;
self.splitViewController.viewControllers = @[masterOneNavigationController, detailNavigationController];
self.window.rootViewController = self.splitViewController;
実行時に、MasterViewControllerTwo を MasterViewControllerOne と交換したい
新しいView Controllerをプッシュするアクション:
MasterViewControllerTwo*mvc2=[[MasterViewControllerTwo alloc]initWithNibName:@"MasterViewControllerTwo_iPad" bundle:nil];
[self.navigationController pushViewController:mvc2 animated:YES];
これにより、mvc1 の上に mvc2 がスワップされます。ただし、mvc2 で tableview の行をタップしても、DetailViewController はアクティブになりません。
DetailView を有効にするには (mvc1 と mvc2 で同じ)、次のようにします。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Item *theItem =[[self.items objectAtIndex:[indexPath section]]objectAtIndex:[indexPath row]];
[self.detailViewController setLabelsForItems:theItem];
}
MasterViewController が appdelegate で splitviewcontrollers 配列のメンバーとして定義されている限り、非常にうまく機能します。では、mvc2 がスタックの最上位にあるときに DetailViewController をアクティブにしないのはなぜでしょうか?