Swift导航控制器嵌入带有segue的标签栏

问题描述 投票:0回答:3

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

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

swift uinavigationcontroller uitabbarcontroller uistoryboardsegue
3个回答
0
投票

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

它将解决您的两个问题

  • 您将在PurpleViewController下面获得Tabbar
  • 其次如果你按下后退按钮,你会得到蓝色的ViewController qazxsw poi

希望它会对你有所帮助。


0
投票

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

解决方案1:您无法获得标签栏控制器,因为在您的代码中您正在呈现视图控制器。您必须在显示标签栏控制器的实例时发送它,或者使用push来查看控制器。

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索引以移动到蓝色控制器。


0
投票

这只是一个有趣的问题,需要深入研究。

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

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

至于purpleViewController,你用.currentContext呈现它。因此,紫色只覆盖绿色。不是全屏。 (以下代码也是绿色VC)

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

这是第一个问题。第二个很重要,因为您不希望每次都出现一个新的紫色VC。所以在导航vc中,首先打破蓝色和紫色vcs之间的segue链接。这将保证橙色由绿色生产。

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

我们可以在PurpleViewController中测试它:(以下代码是紫色的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的精确方法。所以你可以在真正需要的时候选择它。

© www.soinside.com 2019 - 2024. All rights reserved.