UITabBarControllerでの遷移先のStoryboardを分割する方法


IOSのアプリ開発を行う際にStoryboardを使用する方も多いかと思います。
ただ、1つのStoryboardに全ての遷移を入れてしまうと、Storyboardが肥大化してしまいます。
大きすぎるStoryboardを読み込むと最悪XCodeが落ちてしまってどうにもならない、
という事も起きてしまうそうです。

そこで大事になるのがStoryboardを分割する事なのですが、
分割方法に関しては調べれば大量に出てくるのでここでは割愛します。

今回自分がぶつかったのはStoryboard分割してかつ、それをUITabBarController
で使用する事です。
その方法を自分への備忘録も含めまとめます。
UITabBarControllerでの分割方法も調べれば結構出てきますが

1.UITabBarControllerの配置

はじめにUITabBarControllerを配置します
ツールバーで検索すれば出てくるので適当に配置すれば大丈夫です。
初期状態だとこんな感じになるかと思います。

Storyboardを分割しないのであればここに遷移をつないでいけばいいのですが、
今回は分割する事が目的なので、コードを書いていきます。

2.UITabBarControllerのコードを書く

UITabBarControllerにつけるコードを書いていきます。
今回自分が実装したのは、
タブを押した際のViewcontollerを差し替える形になります。
コードは以下の通りです。

SplitStoryBoardTabController.h
#import <UIKit/UIKit.h>

@interface SplitStoryBoardTabController : UITabBarController

@end

SplitStoryBoardTabController.m
#import <UIKit/UIKit.h>



#import "SplitStoryBoardTabController.h"



@implementation SplitStoryBoardTabController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSMutableArray* viewControllers = [self.viewControllers mutableCopy];
    NSUInteger size = viewControllers.count;
    for( NSUInteger i=0; i<size; ++i )
    {
        UIViewController* viewController = viewControllers[i];

        @try {

            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:viewController.title bundle:nil];

            // ここで表示したい ViewController を指定する
            UIViewController* setViewController;
            setViewController = [storyboard instantiateInitialViewController];
            viewControllers[i] = setViewController;
        }
        @catch (NSException *exception) {
            NSLog(@"Err : %@", exception.name);
        }


    }
    self.viewControllers = viewControllers;

}

@end

UITabBarControllerはタブを押した際の遷移先をviewControllersという
プロパティに保持しています。
これを差し替えることによって遷移先を分割したStoryboardのViewControllerへの
遷移を実現します。

また、Storyboardのファイル名はタブコントローラについているViewControllerの
Titleから取得するようにしてみました。

このクラスを先ほど設置したUITabBarControllerに設定します。

3.Storyboardのタイトルを設定

最後にViewControllerのTitleを設定して読み込む
Storyboardを指定します。

こんな感じで設定してあげると、タブの遷移先が指定のStoryboardのIs Initialが付いている
ViewContorllerになります。

以上となります。