简体   繁体   中英

Suppress moreNavigationController in custom UITabBarController

I have implemented a custom UITabBar solution for a project. Essentially, if there are more than 5 items, I use a scrollView that will allow the user to scroll through the additional tab items and suppresses the more button. A similar look and feel can be seen in the Weather Channel app.

Each tab bar item corresponds to a UINavigationController that manages the stack of views for each tab. The issue I'm having is when I have more than 5 tab items, from tab 5 onward does not correctly maintain the navigation stack. It seems that the moreNavigationController kills the navigation stack each time you return to that tab and you are brought to the initial page again.

I've overridden the setSelectedViewController method as follows:

- (void) setSelectedViewController:(UIViewController *)selectedViewController {
    [super setSelectedViewController:selectedViewController];
    if ([self.moreNavigationController.viewControllers count] > 1) {
        self.moreNavigationController.viewControllers = [[NSArray alloc] initWithObjects:self.moreNavigationController.visibleViewController, nil];
    }
}

This code will remove the More functionality on the left nav button but it doesn't solve the issue of maintaining the navigation stack. All other tabs work fine. I can traverse down several views and the stack is maintained after I leave and return to that tab. I understand that this is a complicated issue so please let me know if there are areas where I can provide clarity. Thanks!

This is how I ended up fixing this:

- (void) setSelectedViewController:(UIViewController *) selectedViewController {
    self.viewControllers = [NSArray arrayWithObject:selectedViewController];
    [super setSelectedViewController:selectedViewController];
}

Basically any tab from 5 on gets its navigation controller replaced by the moreNavigationController when you intiially set the viewControllers on UITabBarController. Therefore, I dynamically set viewControllers to just contain the tab I'm clicking. There never ends up being more than 1 in this case so the moreNavigationController doesn't come into play.

When I init my custom controller, I just supply the first tab as the viewControllers so the application can load.

- (id) init {
    self = [super init];
    if (self) {
        self.delegate = self;
        [self populateTabs];
    }
    return self;
}

- (void) populateTabs {
    NSArray *viewControllers = [self.manager createViewsForApplication];
    self.viewControllers = [NSArray arrayWithObject:[viewControllers objectAtIndex:0]];
    self.tabBar.hidden = YES;
    MyScrollingTabBar *tabBar = [[MyScrollingTabBar alloc] initWithViews:viewControllers];
    tabBar.delegate = self;
    [self.view addSubview:tabBar];
}

For clarity, the tabBar delegate is set to this class so that it can respond to tab clicks. The delegate method is as follows:

- (void) tabBar:(id) bar clickedTab:(MyScrollingTabBarItem *) tab {
    if (self.selectedViewController == tab.associatedViewController) {
        [(UINavigationController *) tab.associatedViewController popToRootViewControllerAnimated:YES];
    } else {
        self.selectedViewController = tab.associatedViewController; 
    }
    // keep nav label consistent for tab
    self.navigationController.title = tab.label.text;
}

You may also override the moreNavigationController var of UITabBarController and return your own custom NavigaitonContorller like so:

override var moreNavigationController: UINavigationController { return MyCustomNavController() }

worked in my case where I needed a NavigaitonController that allowed hiding the NavigationBar when scrolling.

As for hiding the Back Button of the MoreNavigationController you can set the leftBarButtonItem of each NavigationItem to anything (even an empty UIBarButtonItem) and the back butotn of the more NavigaitonController will disappear.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM