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

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

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

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

VC后面的Tabbar

  // 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的唯一方法是先用VCV嵌入VC1而不是再次点击VC1嵌入tabVC(它不允许我插入一个之前) tabVC和我还必须在嵌入NavVC后再次单击VC1)。

解

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

  • 让我一步一步解释,

    1. 为了满足您的要求,我们必须添加一个嵌入UINavigationControllerUIViewController (比如说InitialVC )并将其作为initial viewcontroller

    2. 然后添加一个带有2个VC( VCA,VCB )的UITabbarController // 重要提示:没有嵌入任何navigationcontroller UITabbarController

    3. InitalVCTabbarController之间添加一个带有唯一标识符的segue (例如:Initial)

    4. initalVC的 viewWillAppear中执行如下的segue(我们的设计不需要InitialVC ,我们只是用来桥接navigationControllertabbarController )。

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

        override func viewDidLoad() { super.viewDidLoad() self.navigationItem.hidesBackButton = true } 
    6. 现在从VCAVCA1之间的按钮添加一个segue ,即它构建和运行,您将看到VCA1通过VCA的tabbar呈现。

  • 我们改变了什么?

    1. 而不是在UITabbarController中添加UINavigationController ,我们反之亦然。 我们不能直接在导航中添加Tabbar,以便我们在它们之间使用InitialVC

结果:

在此处输入图像描述

第一种方法是使用UIGraphicsGetImageFromCurrentImageContext创建tabbar的图像,并将其设置在另一个视图的底部…

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

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