gpt4 book ai didi

ios - 在自定义 UITabBarController 中抑制 moreNavigationController

转载 作者:可可西里 更新时间:2023-11-01 03:52:44 26 4
gpt4 key购买 nike

我已经为一个项目实现了一个自定义的 UITabBar 解决方案。本质上,如果项目超过 5 个,我会使用一个 scrollView,它允许用户滚动浏览其他选项卡项目并抑制更多按钮。在 Weather Channel 应用程序中可以看到类似的外观和感觉。

每个选项卡栏项目都对应一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com