【问题标题】:How to show different ViewControllers when tapping on tabBar in swiftswift - 快速点击tabBar时如何显示不同的ViewController
【发布时间】:2021-05-21 10:17:03
【问题描述】:

我有三个 viewController,其中两个连接到 tabBarController。因此,当点击 tabBar 项here is my storyboard时,应用程序应该显示两个 vc 的依赖 Bool 值之一@

import UIKit

class TabBarController: UITabBarController, UITabBarControllerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
      
        
    }
    
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        let userLoggedIn: Bool!
        if tabBarController.selectedIndex == 1{
            if userLoggedIn == true{
                // show firstVC
            }else{
                // show secondVC
            }
        }
    }
}

【问题讨论】:

  • 是的!我',正在使用故事板制作 UI
  • 您是否尝试在 TabBarController 的 viewWillAppear 中设置 self.selectedIndex ?以及如何初始化 userLoggedIn ?
  • userLoggenIn 就是一个例子。我将从 userDefaults 获得布尔值

标签: ios swift uitabbarcontroller uitabbar presentviewcontroller


【解决方案1】:

您可以将 childViewController 与父级 ViewController 一起使用。

   override func viewDidLoad() {
        super.viewDidLoad()
        
       ///add two ChildVC here, hide 1 ifneeded
    }

单击此选项卡时,您会检查userLoggedIn

   override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        if userLoggedIn == true {
               /// show first childVC
               /// hide second childVC
         } else {
                /// hide first childVC
               /// show second childVC
         }
    }

您可以查看演示:Demo

【讨论】:

  • 如何初始化 childVC。并且不要忘记我有应该保持独立的第三个VC
  • 所有视图控制器都有自己的 UI 和代码,所以我不想重建每个 VC 的 UI
  • @您只需初始化 childVC 控制器并添加到此。无需重新构建,只需重新构建代码
  • 所以你能展示如何初始化 childVC,因为我对编程很陌生,我不知道该怎么做
  • @好的,我会为你创建一个例子。
【解决方案2】:

像这样在 viewDidLoad 中将 .overCurrentContext 添加到 modalPresentationStyle。

 let newVC = self.storyboard?.instantiateViewController(withIdentifier:"secondVC")
 newVC?.modalPresentationStyle = .overCurrentContext
 self.present(newVC!, animated: false, completion: nil)

【讨论】:

    【解决方案3】:

    修改userLoggedIn变量时只需设置viewController列表(假设userLoggedIn为TabBarCOntroller实例变量):

    class TabBarC: UITabBarController {
    
        @IBOutlet var firstVC : FirstViewController!
        @IBOutlet var secondVC : SecondViewController!
        @IBOutlet var thirdVC : ThirdViewController!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
            for vc in self.viewControllers! {
                if let fv = vc as? FirstViewController {
                    firstVC = fv
                } else if let fv = vc as? SecondViewController  {
                    secondVC = fv
                } else if let fv = vc as? ThirdViewController  {
                    thirdVC = fv
                }
            }
        }
    
    
        var userLoggedIn : Bool = false {
            didSet {
            if userLoggedIn {
                self.viewControllers = [firstVC, thirdVC]
            } else {
                self.viewControllers = [secondVC, thirdVC]
            }
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            self. userLoggedIn = false
        }
    
        override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
            if item.tag == 3 { // For purpose of test i set tag for 3 VC to 1 for firsttVC, 2 for secondVC, 3 for thirdVC
                // for test : change login value each time thirdVC is selected
                userLoggedIn = ! userLoggedIn
            }
        }
    

    因此,每次从代码中的任何位置设置 userLoggedIn,tabor 都会显示所需的标签栏项目。 3 VC被添加到stpryboard中的tabbar。 选择第三个VC时,第一个标签栏项目在一个和两个之间变化

    【讨论】:

    • 您的想法看起来很棒,但屏幕上没有任何变化
    • 这会发生吗,因为我已经在故事板中连接了 VC 的工作 tabbarcontroller 吗?
    • 只有一件事:您需要在代码中的某处(例如 viewWillAppear)初始化 userLoggedIn 以使标签栏成为第一个状态:在初始化阶段不调用 didSet,但仅在稍后修改值时调用)。您还应该在情节提要的标签栏中添加 3 VC。
    • 我已经在 VC2 中通过 userDefaults 定义了 userStatus。
    • @Plit Xav。正如你所说,我重组了我的代码。注意屏幕上的变化
    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多