点击 tabBar 项目应该总是打开第一个视图控制器

Posted

技术标签:

【中文标题】点击 tabBar 项目应该总是打开第一个视图控制器【英文标题】:Tapping on a tabBar item should always open the first view controller 【发布时间】:2018-09-05 05:57:12 【问题描述】:

我有一个带有标签栏导航(5 个按钮)的应用程序。点击 5 个标签栏按钮中的一个时,是否可以始终打开导航的第一个控制器?比如button1打开VC1(带导航控制器),可以打开VC2,可以打开VC3等。如果我在VC3上,然后点击另一个标签栏按钮(比如说button2),然后再次点击button1,我希望它打开 VC1,而不是我离开它的 VC3。

我试过这个,但由于某种原因它没有像我预期的那样工作:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) 
    self.navigationController?.popToRootViewController(animated: true)
    viewController.navigationController?.popToRootViewController(animated: true)

【问题讨论】:

所以,为了确保我理解你的情况:你想点击一个标签按钮(比如第三个),它必须将你导航到另一个标签(比如第一个)并弹出到它的根目录,对吗? @AhmadF 不,只是在点击其中一个标签栏按钮时,它必须打开所选标签的根控制器(其导航的第一个控制器)。 好吧,所以我相信这是两次点击它时的默认行为(第一次点击用于登陆选项卡,第二次用于弹出到根视图);你想通过点击一次来实现它,对吗? @AhmadF 正确,只需轻轻一按。 【参考方案1】:

为了实现这个功能,我将代码写在tabBarDelegatedidSelect方法中。

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) 
            let rootView = self.viewControllers![self.selectedIndex] as! UINavigationController
            rootView.popToRootViewController(animated: false)
     

【讨论】:

【参考方案2】:

首先,这种行为是默认,当用户在选项卡按钮上点击 2 次时(第一次点击用于登陆到选项卡,第二次点击用于弹出到根目录)。我建议不要编辑此行为,因为它与用户体验有关...

但是,如果您的目标是实现它(只需轻按 1 次即可弹出到根目录),请将 tabBarController(_:didSelect:) 实现为:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) 
  navigationController?.popToRootViewController(animated: true)

应该足够了,这意味着您的代码 sn-p 应该可以工作!尽管如此,问题似乎是该方法没有甚至被调用,因此确保视图控制器确实符合UITabBarControllerDelegate,并实现:

tabBarController?.delegate = self

将其添加到viewDidLoad() 方法中应该没问题。

【讨论】:

以上是关于点击 tabBar 项目应该总是打开第一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如果在视图控制器中使用 Tabbar,如何设置主视图控制器

添加 TabBar 元素

打开 TabBar 子视图

Swift 4 - 如何覆盖标签栏将打开视图控制器

从视图控制器加载 Tabbar 控制器

从简单的视图控制器移动到 TAB BAR 控制器