在标签栏控制器中设置视图控制器
Posted
技术标签:
【中文标题】在标签栏控制器中设置视图控制器【英文标题】:Setting a view controller in a tab bar controller 【发布时间】:2014-08-20 20:36:13 【问题描述】:我的应用有标签栏控制器,它在其 viewDidLoad 方法中加载 3 个视图控制器。
- (void)viewDidLoad
[super viewDidLoad];
...
[self setViewControllers:@[firstViewController,
secondViewController,
thirdViewController,
]];
我希望它显示一个不同于这三个控制器的视图控制器 (homeViewController)。首次加载选项卡栏时,不会选择这三个选项卡栏。我想通过按标签栏项目来更改它们,并通过按导航左栏按钮返回主视图。
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:btnImage
style:UIBarButtonItemStylePlain
target:self
action:@selector(setHomeView)];
如何在第一次加载标签栏控制器而不将其添加到标签栏项目时显示 homeViewController?
【问题讨论】:
UITabBarController
不适合以这种方式使用。在大多数情况下,每个UITabBarController
本质上都会有自己的UINavigationController
,因此也有自己的堆栈。这些选项卡都彼此分开。如果我去firstViewController
,然后被推到另一个VC,然后单击第二个选项卡,我不再有导航左栏按钮返回主VC。您不能在 Home VC 上,然后转到 Tab 1,然后是 Tab 3,并且仍然有一个返回按钮可以返回到 home VC。重新考虑您的 UI/UX 流程。
所有这三个视图控制器都继承自同一个基类,因此它们具有相同的导航左栏按钮
但它们不会有相同的导航堆栈。 UITabBarController 旨在将 rootViewController 与 firstVC、secondVC、thirdVC 交换。它们中的每一个都有不同的导航堆栈,它们保留的唯一方法是你执行 self.navigationController.push。这样做的问题是我可以做到 -> HomeVC -> 1st -> 3rd -> 1st -> 3rd -> 1st -> 3rd -> 1st ->3rd。现在我必须按 9 次后退按钮才能返回主屏幕。这也会占用大量内存,并且您无法恢复之前可能拥有的任何堆栈。
我明白了。有没有其他方法可以实现这种导航?
说实话,大多数人只是将 HomeVC 添加到 UITabBarController
以解决此问题,因此他们可以执行 self.window.rootViewController = homeVC,firstVC,secondVC,thirdVC。否则,如果它只是一个登陆屏幕,他们就不会在乎一旦过去就能够返回它。
【参考方案1】:
标签栏控制器默认将 index0 处的第一个 ViewController 设置为主控制器。
如果您不希望应用程序的第一个 ViewController 存在于 tabBarController 中,那么您必须创建 HomeVC 并将其设置为应用程序的入口点,但选项卡栏不会出现在其中看法。
除非它位于这三个导航堆栈内的某个位置,否则无法在 TabBarController 内呈现视图控制器。
【讨论】:
但是我想在应用程序加载时显示标签栏。以上是关于在标签栏控制器中设置视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
如何让自定义标签栏显示标签栏项目在 Xcode 中设置的选定图像?