user2970912
user2970912

Reputation: 21

UITabBarController doesn't carry through when i push a new view from a UINavigationController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:   (NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.


FirstViewController *fvc = [[FirstViewController alloc] init];
SecondtViewController *svc = [[FirstViewController alloc] init];


//Create UITabBarController
UITabBarController *theTabBarController = [[UITabBarController alloc] init];
NSArray *viewControllers = [NSSArry arrayWithObjects: fvc, svc, nil];
[theTabBarController setViewControllers:viewControllers];


// Create UINavigationController
UINavigationController *theNavigationController = [[UINavigationController         
alloc]initWithRootViewController:theTabBarController];
[[self window] setRootViewController:theNavigationController];


self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

Then in the First View Controller i do a push to a second view

- (IBAction)Page2:(id)sender {
SBHomePageDetailViewController *detailPageViewController =   [[SBHomePageDetailViewController alloc] init];
// Pushing to the stack

[[self navigationController] pushViewController:detailPageViewController animated:YES];
}

Now my UI shows the second view, however, the UITabBarController is missing. When i navigate back the tab bar view is back. How do I keep the tab bar controller visible in all ui screens?

Upvotes: 2

Views: 155

Answers (2)

Guto Araujo
Guto Araujo

Reputation: 3854

The problem in the code is that it tries to initialize a UITabBarController as the rootViewController of a UINavigationController in this line:

// Create UINavigationController
UINavigationController *theNavigationController = [[UINavigationController alloc]initWithRootViewController:theTabBarController];

From the docs:

rootViewController: The view controller that resides at the bottom of the navigation stack. This object cannot be an instance of the UITabBarController class.

Try removing that line and, per @rmaddy's suggestion, put each View Controller in a Navigation Controller. Then set those Navigation Controllers as the Tab Bar Controller's VCs and set the App's RootViewController to the Tab Bar Controller:

FirstViewController *fvc = [[FirstViewController alloc] init];
SecondtViewController *svc = [[SecondtViewController alloc] init];


// Create the first UINavigationController
UINavigationController *firstNavigationController = [[UINavigationController
                                                    alloc]initWithRootViewController:fvc];

// Create the second UINavigationController
UINavigationController *secondNavigationController = [[UINavigationController
                                                    alloc]initWithRootViewController:svc];

//Create UITabBarController
theTabBarController = [[UITabBarController alloc] init];
NSArray *viewControllers = [NSArray arrayWithObjects: firstNavigationController, secondNavigationController, nil];
[theTabBarController setViewControllers:viewControllers];

[[self window] setRootViewController: theTabBarController];

Upvotes: 0

Igor
Igor

Reputation: 1332

Into AppDelegate.h file make property of theTabBarController:

@property (nonatomic, strong) UITabBarController *theTabBarController;

And here how I changed your didFinishLaunchingWithOptions method:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.


    FirstViewController *fvc = [[FirstViewController alloc] init];
    SecondtViewController *svc = [[SecondtViewController alloc] init];


    // Create UINavigationController
    UINavigationController *theNavigationController = [[UINavigationController
                                                        alloc]initWithRootViewController:fvc];

    //Create UITabBarController
    self.theTabBarController = [[UITabBarController alloc] init];
    NSArray *viewControllers = [NSArray arrayWithObjects: theNavigationController, svc, nil];

    [self.theTabBarController setViewControllers:viewControllers];

    [[self window] setRootViewController:theNavigationController];
    [[self window] addSubview:self.theTabBarController.view];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    return YES;
}

Upvotes: 1

Related Questions