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

Posted

技术标签:

【中文标题】如果在视图控制器中使用 Tabbar,如何设置主视图控制器【英文标题】:How to set homeview controller if use a UITabbar in a viewcontroller 【发布时间】:2018-10-26 12:06:16 【问题描述】:

我在视图控制器中添加了一个单独的 UITabbar。制作了所有必要的插座。主视图控制器中有标签栏。我想要什么如果我点击第一个按钮应该没有变化,但如果点击第二个标签栏项目,它应该显示第二个屏幕。

    func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)
        switch item.tag 

        case 1:
            if sampleOne == nil 

                var storyboard = UIStoryboard(name: "Main", bundle: nil)

                sampleOne = storyboard.instantiateViewController(withIdentifier: "s1") as! SampleOneViewController
            
            self.view.insertSubview(sampleOne!.view!, belowSubview: self.sampleTabBar)

            break


        case 2:
            if sampleTwo == nil 

                var storyboard = UIStoryboard(name: "Main", bundle: nil)

                sampleTwo = storyboard.instantiateViewController(withIdentifier: "s2") as! SampleTwoViewController
            
            self.view.insertSubview(sampleTwo!.view!, belowSubview: self.sampleTabBar)

            break

        default:

            break

        

    But it loads Homeviewcontroller first then it shows the other viewcontroller. 
    Now how should i set the homeviewcontroller(which has uitabbar in it) as first viewcontroller. 

为了安布的帮助?

【问题讨论】:

为什么你不使用 UITABBarController。它很容易,将节省您的时间 使用UITabBarController with UINavigationcontroller 方便导航。 问题是我想要一个用于库使用的视图控制器,这就是我选择单独的 uitabbar 的原因。现在我想如果按下第一个标签栏,我需要显示主屏幕(其中有标签栏) 不用担心它是 tabbarController 的原生行为。 如果第一个标签栏项目被按下,如何返回主屏幕? 【参考方案1】:

根据文档,如果您想在不同视图之间切换同时保持视图控制器相同,请使用 UITabBar。但是如果你想在不同的视图控制器之间切换,UITabBarController 应该是首选的方式。

在使用 UITabBar 切换视图控制器时可能面临的问题是您需要手动处理很多事情。例如。添加和删​​除您的子视图控制器。

但如果您仍然坚持这样做,请在您的视图控制器之间使用父子关系。将您的 HomeViewController 设为父视图。现在在viewDidLoad 上假设默认选择第一项,添加 SampleOneViewController 如下:

        if let vc = self.storyboard?.instantiateViewController(withIdentifier: "s1") as? SampleOneViewController 
        self.addChildViewController(vc)
        self.view.insertSubview(vc, belowSubview: tabBar)
    

现在,在标签栏委托中,您需要先删除以前的子视图控制器,然后再添加索引选择的视图控制器。

所以你的委托方法会变成这样:

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)
    switch item.tag 

// Remove the previous child viewcontrollers
    for vc in self.childViewControllers 
        vc.willMove(toParentViewController: nil)
        vc.view.removeFromSuperview()
        vc.removeFromParentViewController()
    


    case 1:

    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "s1") as? SampleOneViewController 
        self.addChildViewController(vc)
        self.view.insertSubview(vc, belowSubview: self.view)
    

        break


    case 2:
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "s2") as? SampleTwoViewController 
        self.addChildViewController(vc)
        self.view.insertSubview(vc, belowSubview: self.view)
    

        break

    default:

        break

    

希望这会有所帮助。

【讨论】:

可以添加视图,但是 homeviewcontrollers 中的按钮和标签等对象会显示在所有视图中。 那是因为您使用的是 insertSubviews 方法。我认为您必须在 HomeViewController 中添加一个单独的 UIView,创建它的插座,然后不要在 self.view 中插入视图,而是将它们添加到该单独的视图中,确保没有其他按钮或标签遮挡它。 其实我在subview: "self.sample" 下添加其他视图! 检查情节提要中 HomeViewController 的视图层次结构。如果 sampleTabBar 上方有任何内容,它将显示在所有其他视图上,因为您正在将其他视图添加到 sampleTabBar 下方。 谢谢你!一个非常简单的问题,但需要更多时间来解决。感谢您对重新排序的帮助。

以上是关于如果在视图控制器中使用 Tabbar,如何设置主视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

iOS 使用 TabBar 改变显示的视图

使用视图控制器的 TabBar 按钮在框架中添加滑动子视图

登录后如何在 swift 4 中使用主视图控制器设置侧边菜单

隐藏 TabBar 控制器

没有 modal、tabbar 和 navigationcontroller 的 UIViewController 工作流管理?

如何从主视图控制器在详细视图控制器中推送新视图?