当前视图控制器当前tabBarController与NavigationController

时间:2016-08-22 01:03:06

标签: ios swift uiviewcontroller

在呈现或解雇VC时,我不想继续隐藏和显示tabBar,因为它会造成糟糕的用户体验。相反,我希望在标签栏上直接显示下一个VC,这样当我通过从左向右缓慢拖动来关闭nextVC时,我可以看到隐藏在视图后面的tabBar(如下图所示)

注意,我的应用程序有两个选项卡,其中包含两个与之关联的VC(VCA,VCB)。两个VC都嵌入了导航栏。 VCA分段为VCA1,VCB分段为VCB1。目前,在VCA和VCB内部,我调用以下函数来查看viewWillappear(下面的代码)时的一些隐藏和取消隐藏。

self.navigationController?.showViewController(vc, sender: self)

Tabbar behind VC

  // Inside ViewWillAppear Only reappear the tab bar if we successfully enter Discover VC (To prevent drag back half way causing tab bar to cause comment entry to be floating). This code check if we have successfully enters DiscoverVC
    if let tc = transitionCoordinator() {
        if tc.initiallyInteractive() == true {
            tc.notifyWhenInteractionEndsUsingBlock({(context: UIViewControllerTransitionCoordinatorContext) -> Void in
                if context.isCancelled() {
                    // do nothing!
                }
                else {
                    // not cancelled, do it
                    self.tabbarController.tabBar.hidden = false
                }
            })
        } else {
            // not interactive, do it
            self.tabbarController.tabBar.hidden = false
        }
    } else {
        // not interactive, do it
        self.tabbarController.tabBar.hidden = false
    }

----------来自GOKUL的工作解决方案-----------

Gokul的答案已接近现场。我已经玩了他的解决方案,并提出了以下改进,以消除冗余VC的需要,并且还消除了在tabVC出现之前短暂显示的初始VC。但是如果没有Gokul,我永远不会想到这个!!

此外,Gokul的方法会为我创建一个错误,因为即使我确实有一个初始"正常"显示tabVC之前的VC作为LoginVC。如果用户需要登录,则此loginVC仅为rootVC。因此,在大多数情况下,通过将rootVC设置为tabVC,将永远不会注册navVC。

解决方案是将导航控制器和tabBar控制器嵌入到一个VC中。但它仅在navVC位于TabBarVC之前才有效。我不知道为什么,但是让我拥有navVC的唯一方法 - > tabVC-> VC1 / VC2首先使用navVC嵌入VC1,然后再次单击VC1以嵌入tabVC(它不允许我在tabVC之前插入一个,我还必须在嵌入NavVC后再次单击VC1)。

solution

3 个答案:

答案 0 :(得分:2)

根据您的要求,我们需要在您给定的视图层次结构中进行一些小的更改

  • 让我一步一步解释,

    1. 为了满足您的要求,我们必须添加UIViewController(假设 InitialVC )嵌入UINavigationController并将其设为initial viewcontroller

    2. 然后添加UITabbarController 2个VC( VCA,VCB )// 重要事项:没有嵌入任何navigationcontroller。< / p>

    3. InitalVC TabbarController 之间添加segue和唯一标识符(例如:初始)

    4. InitalVC viewWillAppear中执行以下的segue(InitialVC对我们的设计是不必要的,我们使用它来桥接navigationController和{ {1}})。

      tabbarController
    5. self.performSegueWithIdentifier("Initial", sender: nil) 课程中隐藏您的后退按钮,这可确保 InitialVC 无法访问。

      TabbarController
    6. 现在从 VCA VCA1 之间的按钮添加 override func viewDidLoad() { super.viewDidLoad() self.navigationItem.hidesBackButton = true } ,即它构建并运行,您将看到VCA1通过VCA的标签栏呈现。

  • 我们改变了什么?

    1. 我们反而不是在segue内添加UINavigationController。我们无法在导航中直接添加Tabbar,以便我们在它们之间使用 InitialVC

<强>结果:

enter image description here

答案 1 :(得分:0)

第一种方法是使用UIGraphicsGetImageFromCurrentImageContext创建标签栏的图像并将其设置在另一个视图的底部...

第二种方式是在tabbar上方的另一个新窗口中显示下一个视图,这样你就不再需要隐藏tabbar了,但是它似乎在导航控制器中,所以这种方式似乎不可用

答案 2 :(得分:0)

不需要隐藏和取消隐藏标签栏。您只需将UITabBarController嵌入UINavigationController内。也就是说,UINavigationController作为初始vc,UITabBarController作为UINavigationController的根vc。