iOSアプリのタブバーに動的に項目を追加するには

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

iOS アプリでよく見る画面下部のタブバーは、基本的に固定した項目を並べることが多いです。
タブの項目は5個を超えると右端が「More」になり、その先がリストになります。

今回紹介する Tips はタブの項目を動的に追加する方法です。
上記のオレンジ枠の「History」を追加してみます。

New Project の Tab Bar Application ひな形でプロジェクトを生成します。
MainWindow.xib を下記のように項目を増やしておきます。

次に追加する項目の ViewController  である。HistoryViewController クラスを生成します。
New File で Cocoa Touch を選び、UIViewController subclass で生成します。

生成された HistoryViewController.m の initWithNibName:bundle: メソッドをオーバーライドして、
タブバー項目を生成する処理を追加します。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.title = @"History";
        UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemHistory tag:0];
        self.tabBarItem = tabBarItem;
        [tabBarItem release];
    }
    return self;
}

アプリケーションデリゲートクラスの application:didFinishLaunchingWithOptions: メソッドで、
タブ項目を追加してみます。tabBarController の viewControllers プロパティにはタブ項目のそれぞれの
コンテンツとなるUIViewController のインスタンスが格納されています。

この配列に HistoryViewController のインスタンスを追加して再びセットします。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    // Add the tab bar controller's current view as a subview of the window
    NSArray *vc = self.tabBarController.viewControllers;
    NSMutableArray *nvc = [NSMutableArray arrayWithArray:vc];
    HistoryViewController *newVC = [[HistoryViewController alloc] initWithNibName:@"HistoryViewController" bundle:nil];
    [nvc addObject:newVC];
    [newVC release];
    [self.tabBarController setViewControllers:nvc];
    
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    
    return YES;
}

以上の追加処理を条件分岐内に行えば、必要に応じてコンテンツを増やすことができます。