前回は storyboard の繋ぎ方について言及しました。今回は appDelegate.m と masterViewController.m の変更箇所について記載します。
appDelegate.m の変更箇所は、
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOption
method です。tabBarController を追加したのでそれを考慮した作りにします。具体的には次の通り:
UISplitViewController* splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController* navigationController = [splitViewController.viewControllers lastObject];
navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
splitViewController.delegate = self;
UINavigationController *masterNavigationController = splitViewController.viewControllers[0];
UITabBarController* tabBarController = navigationController.topViewController;
MasterViewController *controller = (MasterViewController *)masterNavigationController.tabBarController.viewControllers;
controller.managedObjectContext = self.persistentContainer.viewContext;
return YES;
tabBarController が navigationController に従属して、masterViewController もそれに倣ってという形。
ここまで書いて build & run してみると error。かなり萎えます。次に、masterViewController.m を変更。変更箇所は次の通り:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.tabBarController.navigationController.toolbarHidden = NO;
self.tabBarController.navigationItem.leftBarButtonItem = self.editButtonItem;
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
self.tabBarController.navigationItem.rightBarButtonItem = addButton;
self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
AppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.persistentContainer.viewContext;
}
見逃しがちなのが、tabBarController.navigationController とするところで、これがないと detail で navigation が表示されなくなる。さらに、最後の appDelegate の指定がないと error になってしまうので、已を得ず記載。
これで error は回避できるし、navigation も表示されるようになるので、しばらくこれで進めてみよう。