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

Posted

技术标签:

【中文标题】Swift 4 - 如何覆盖标签栏将打开视图控制器【英文标题】:Swift 4 - How to override tab bar will open view controller 【发布时间】:2019-01-10 23:11:02 【问题描述】:

是否有可能当用户点击一个标签栏项目时,我可以在 UITabBarController 中覆盖它,然后我检查 UserDefault ,然后决定我是显示视图还是 return 并且他们留下他们目前的看法?

应该是这样的:

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) 
    if item.image == UIImage(named: "TabProfile")
    
        // Profile tab selected
        if !loginController.isUserLogged()
        
            // Not logged in...
            showLoginView()  

            // Following line doesn't work...
            tabBarController?.selectedIndex = selectedIndex
        
    

如果可能,我想执行此检查,如果 false 则实际上阻止视图到达 viewDidLoad

谢谢。

【问题讨论】:

在用户登录之前完全避免添加标签不是更好吗?或者至少在用户登录之前禁用标签栏项目? @rmaddy 我想过这个,但我希望用户能够浏览所有内容而无需创建帐户。 您的整个问题是询问如何有条件地阻止用户选择选项卡。也许我在评论中提出了错误的条件,但它仍然存在。在满足条件之前不要添加(或只是禁用)选项卡。 在这种情况下,访客用户和个人资料标签栏项目之间的交互显示登录弹出窗口。这是所需的功能。也许我的问题措辞错误并且没有给出足够的上下文。还是谢谢你 【参考方案1】:

我猜你需要

func tabBarController(_ tabBarController: UITabBarController, 
              shouldSelect viewController: UIViewController) -> Bool 
   if let ind = tabBarController.viewControllers!.index(of:viewController) , ind == 2  // suppose profile is 2
      // 
       if userNotLogged  
         // present modal login view 
         return false
        
    
  return true

【讨论】:

以上是关于Swift 4 - 如何覆盖标签栏将打开视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

为定制的视图控制器覆盖非打开实例 swift

如何在swift中最初打开一个表视图到选定的详细视图

swift 4 中使用 performSegue 打开的关闭页面时,如何在视图控制器和 TableViewController 之间传递数据?

将原型单元连接到视图控制器 [Swift 4]

当使用在swift 4中使用performSegue打开的dismiss页面时,如何在视图控制器和TableViewController之间传递数据?

Swift如何更新先前视图控制器中的标签