moreNavigationController

moreNavigationController

我已经为项目实现了自定义的UITabBar解决方案。本质上,如果有5个以上的项目,我将使用scrollView,该滚动 View 将允许用户滚动浏览其他选项卡项目并取消显示more按钮。在“天气 channel ”应用程序中可以看到类似的外观。

每个选项卡栏项目对应于一个UINavigationController,该UINavigationController管理每个选项卡的 View 堆栈。我遇到的问题是,当我有5个以上的选项卡项目时,从选项卡5开始无法正确维护导航堆栈。似乎每次返回到该选项卡,moreNavigationController都会杀死导航堆栈,并再次带到初始页面。

我已经重写了setSelectedViewController方法,如下所示:

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

此代码将删除左侧导航按钮上的“更多”功能,但不能解决维护导航堆栈的问题。所有其他选项卡都可以正常工作。我可以遍历几个 View ,并且在离开并返回到该选项卡后将保持堆栈。我知道这是一个复杂的问题,因此请让我知道是否有需要澄清的地方。谢谢!

最佳答案

这就是我最终解决此问题的方式:

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

基本上,当您在UITabBarController上初始设置viewControllers时,从5开始的任何选项卡都将其导航 Controller 替换为moreNavigationController。因此,我动态地将viewControllers设置为仅包含我单击的选项卡。在这种情况下,永远不会超过1,因此moreNavigationController不会起作用。

当我初始化自定义 Controller 时,我只提供第一个选项卡作为viewControllers,以便可以加载应用程序。
- (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];
}

为了清楚起见,将tabBar委托(delegate)设置为此类,以便它可以响应于选项卡单击。委托(delegate)方法如下:
- (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;
}

关于ios - 在自定义UITabBarController中禁止moreNavigationController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10402432/

10-12 19:06