Master-Detail template で tabBarController を追加する方法 (3)

前回は 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 も表示されるようになるので、しばらくこれで進めてみよう。