14628


StoryBoardを使わずにtabBarAppを作っています。AppDelegate.mに以下のようなコードを書いています。

[code]

    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
        //tabBarの生成
        [self initTabBar];
    
        if([self isFirstRun]){
            //初回起動の場合、別のviewControllerに遷移
        }
    
        return YES;
    }
    
[/code]

初回起動時に表示されるviewControllerはtabBarもnavigationBarも使っていません。初回設定が終わった後に通常時はじめに表示されるviewControllerに遷移すると、tabBarが生成されません。初回設定のviewControllerをすべて破棄してはじめの画面に遷移したいのですが、どうすれば良いでしょうか。

\---追記---  
ご指摘ありがとうございます。以下がinitTabBarのコードです。

[code]

    -(void)initTabBar{
        FirstTabViewController *firstTabViewController = [[FirstTabViewController alloc] initWithNibName:nil bundle:nil];
        SecondTabViewController *secondTabViewController = [[SecondTabViewController alloc] initWithNibName:nil bundle:nil];
        ThirdTabViewController *thirdTabViewController = [[ThirdTabViewController alloc] initWithNibName:nil bundle:nil];
    
        self.tabBarController = [[UITabBarController alloc] initWithNibName:nil bundle:nil];
        self.tabBarController.viewControllers = [NSArray arrayWithObjects:firstTabViewController, secondTabViewController, thirdTabViewController, nil];
        self.tabBarController.delegate = self;
    
        firstTabViewController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"first" image:nil selectedImage:nil];
        secondTabViewController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"second" image:nil selectedImage:nil];
        thirdTabViewController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"third" image:nil selectedImage:nil];
    
        [self.window setRootViewController:tabBarController];
        self.window.backgroundColor = [UIColor whiteColor];
        [window makeKeyAndVisible];
    }
    
[/code]

\---さらに追記---  
ご指摘ありがとうございます。以下がisFirstRunのコードです。

[code]

    -(BOOL)isFirstRun{
     NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
     if([ud objectForKey:@"firstRunDate"]){
         return NO;
     }
     return YES;
    }
    
[/code]

初回起動の場合の処理については以下のように行っています。

[code]

    SetupViewController *setupVC = [[SetupViewController alloc] init];
    [self.window setRootViewController:setupVC];
    
[/code]

また、SetupViewControllerでの設定が終了したあとは以下のようなコードで遷移させています。

[code]

    FirstTabViewController *firstTabVC = [[FirstTabViewController alloc] init];
    firstTabVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentViewController:firstTabVC animated:YES completion:nil];
    
[/code]

すると、遷移後にTabBarが表示されないという問題が生じます。


CC BY-SA 3.0
2015-08-17T08:28:17.173
14520
2015-08-19T13:45:32.673
2015-08-19T09:02:45.937
10958
10958
question
ios objective-c
StoryBoardを使わないtabBarControllerの扱い方について


`SetupViewController`を`rootViewController`に指定した時点で、`UITabbarController`以下のビューコントローラを破棄してしまっているためです。再生成しているのは`FirstTabViewController`なのでタブが表示されなくなります。

実装の方針はいくつかありますが、UITabbarControllerを一度だけ生成するのが良いと思います。

[code]

    SetupViewController *setupVC = [[SetupViewController alloc] init];
    [self.window setRootViewController:setupVC];
    
[/code]

この処理を、

[code]

    SetupViewController *setupVC = [[SetupViewController alloc] init];
    [self.window.rootViewController presentViewController:setupVC animated:YES completion:nil];
    
[/code]

に変えます。そして、`setupVC`でやりたい処理が終わったら、

[code]

    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    
[/code]

を実行すれば、`UITabbarController`が表示されると思います。

もし`setupVC`から他の`ViewController`を`presentViewController:animated:completion:`で呼び出している場合は、`setupVC`に対して`dismissViewControllerAnimated:completion:`を実行すれば、途中の`ViewController`は全て破棄されます。


CC BY-SA 3.0
2015-08-19T13:45:32.673
14628
2015-08-19T13:45:32.673
5337
14520
answer