带有Segue的选项卡栏中嵌入的Swift导航控制器

时间:2019-04-01 17:32:24

标签: swift uinavigationcontroller uitabbarcontroller uistoryboardsegue

鉴于以下设置,我希望能够从绿色变为橙色。但是,当我这样做时,将创建一个没有标签栏的橙色新实例。如果可能的话,我真的很想拥有标签栏。我以为不是使用segue,而是将所选索引更改为nav控制器,然后使用下面的代码转发到orange。但是我仍然没有标签栏。

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "orangeView") as! OrangeViewController
self.present(nextViewController, animated:true, completion:nil)

问题2-当橙色在最上面时,我想在导航堆栈中返回一个屏幕(变为蓝色)。如果通过导航控制器到达那很容易-我只是弹出视图。但是,如果我从绿色变成橙色,似乎没有办法变成蓝色。我真的以为更改所选索引应该可以...但是没有。

enter image description here

3 个答案:

答案 0 :(得分:0)

根据您提到的语句和提供的代码,以下是可能的情况:

解决方案1:您无法获得标签栏控制器,因为在您的代码中将显示视图控制器。您必须在展示时发送标签栏控制器的实例,或者使用推式视图控制器。

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "purpleView") as! PurpleViewController
self.pushViewController(nextViewController, animated:true, completion:nil)

但是,为了从绿色推送到橙色视图控制器,您的绿色视图控制器应嵌入在导航控制器中。 (将绿色视图控制器嵌入导航控制器中)

解决方案2:由于您已直接从绿色视图控制器移至橙色视图控制器。在绿色和橙色视图控制器之间的堆栈中没有蓝色控制器,因此,您无法弹出到蓝色视图控制器。 相反,在从橙色视图控制器上按回去时,切换到标签栏控制器的0索引以移动到蓝色控制器。

答案 1 :(得分:0)

首先,您必须选择TabbarController的第一个索引,然后将PurpleViewController推入导航控制器,如下所示

这将解决您的两个问题

  • 您将在PurpleViewController下面获得Tabbar
  • 第二次 按下返回按钮,您将获得blueViewController

    tabBarController?.selectedIndex = 0
    
    if let navC = tabBarController?.viewControllers?.first as? UINavigationController {
    
       let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
       let nextViewController = storyBoard.instantiateViewController(withIdentifier: "purpleView") as! PurpleViewController
       navC.pushViewController(nextViewController, animated: true)
    
    }
    

希望它会对您有所帮助。

答案 2 :(得分:0)

这只是一个有趣的问题,有很多要挖掘的要点。

为简化这种情况,如果要从绿色显示紫色视图并显示标签栏,则可以定义vc的上下文。(以下代码为绿色VC)

 override func viewDidLoad() {
    super.viewDidLoad()
    self.definesPresentationContext = true
}

对于purpleViewController,您将其显示为.currentContext。因此,紫色仅覆盖绿色。不全屏。 (以下代码也是绿色VC)

  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        let purple =   self.storyboard?.instantiateViewController(withIdentifier: "purpleView") as! PurpleViewController
        purple?.modalPresentationStyle = .currentContext
        self.present(purple!, animated: true, completion: {
        })
    }


} 

这是第一个问题。第二个很重要,因为您不想每次都呈现一个新的紫色VC。因此,在导航vc中,您首先要断开蓝色和紫色vc之间的segue链接。这将确保橙色的一个由绿色产生。

实际上,这是一个技巧,您可以在两个选项卡上显示相同的vc。

我们可以在PurpleViewController中对其进行测试:(以下代码是紫色VC)

   override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

   guard (self.presentingViewController?.tabBarController?.selectedIndex)! == 1 else {return }. 

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    if let nv = self.presentingViewController?.tabBarController?.viewControllers?.first as? UINavigationController{
        nv.pushViewController(self, animated: false)
    }}
}

这是在两个选项卡中显示相同vc的精确方法。因此,您可以在确实需要它们时选择它。