Suppress moreNavigationController in custom UITabBarController

后端 未结 2 2060
遥遥无期
遥遥无期 2021-02-09 19:17

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 addit

2条回答
  •  日久生厌
    2021-02-09 20:11

    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;
    }
    

提交回复
热议问题