Swift 导航控制器嵌入在带有 segue 的选项卡栏中
Posted
技术标签:
【中文标题】Swift 导航控制器嵌入在带有 segue 的选项卡栏中【英文标题】:Swift navigation controller embedded in tab bar with segue 【发布时间】:2019-04-01 17:32:24 【问题描述】:鉴于以下设置,我希望能够从绿色转为橙色。但是,当我这样做时,会创建一个不带标签栏的新橙色实例。如果可能的话,我真的很想拥有标签栏。我想而不是使用 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 - 当橙色位于顶部时,我想在导航堆栈中返回一屏(变为蓝色)。如果我通过导航控制器到达那里,那很容易——我只是弹出视图。但是如果我从绿色变成橙色,似乎没有办法变成蓝色。我真的认为更改选定的索引应该可以工作......但它没有。
【问题讨论】:
PurpleViewController 是您要导航到的那个? 正确 - 我想从绿色变为紫色。 我在下面给出了我的答案,这将解决你的两个问题。 抱歉造成混淆 - 虽然我的代码显示紫色是我要导航的那个,但我刚刚意识到我的图像实际上显示为橙色。我将编辑代码以匹配图像... 【参考方案1】:首先您必须选择 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】:根据您提到的陈述和提供的代码,以下是可能的情况:
解决方案 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 索引以移动到蓝色控制器。
【讨论】:
【参考方案3】:这只是一个有趣的问题,有很多值得挖掘的地方。
为了简化情况,如果你想从绿色呈现紫色视图并显示标签栏,你可以为 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 中,你首先打破了蓝色和紫色 vcs 之间的 segue 链接。这将保证橙色是由绿色生产的。
实际上,您可以在两个选项卡上显示相同的 vcs,这是一个技巧。
我们可以在 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 的精确方式。因此,您可以在真正需要它们时选择它。
【讨论】:
以上是关于Swift 导航控制器嵌入在带有 segue 的选项卡栏中的主要内容,如果未能解决你的问题,请参考以下文章