Swift 带 segue 的标签栏中嵌入的导航控制器
Swift navigation controller embedded in tab bar with segue
鉴于下面的设置,我希望能够从绿色过渡到橙色。但是,当我这样做时,会创建一个没有标签栏的新 orange 实例。如果可能的话,我真的很想拥有标签栏。我想不使用 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 - 当橙色在顶部时,我想在导航堆栈中返回一个屏幕(到蓝色)。如果我通过导航控制器到达那里,那很容易 - 我只是弹出视图。但是如果我从绿色变成橙色,似乎就没有办法变成蓝色了。我真的认为更改选定的索引应该有效...但它没有。
根据您的陈述和提供的代码,可能出现的情况如下:
解决方案 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 索引以移动到蓝色控制器时。
首先你必须 select 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)
}
希望对您有所帮助。
这只是一个有趣的问题,有很多值得挖掘的地方。
为了简化情况,如果你想从绿色显示紫色视图并且显示标签栏,你可以为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 之间的转场 link。这将保证橙色的是用绿色生产的。
实际上,这是一个技巧,您可以在两个选项卡上显示相同的 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 的精确方式。所以当你真正需要它们的时候,你可以选择它。
鉴于下面的设置,我希望能够从绿色过渡到橙色。但是,当我这样做时,会创建一个没有标签栏的新 orange 实例。如果可能的话,我真的很想拥有标签栏。我想不使用 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 - 当橙色在顶部时,我想在导航堆栈中返回一个屏幕(到蓝色)。如果我通过导航控制器到达那里,那很容易 - 我只是弹出视图。但是如果我从绿色变成橙色,似乎就没有办法变成蓝色了。我真的认为更改选定的索引应该有效...但它没有。
根据您的陈述和提供的代码,可能出现的情况如下:
解决方案 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 索引以移动到蓝色控制器时。
首先你必须 select 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) }
希望对您有所帮助。
这只是一个有趣的问题,有很多值得挖掘的地方。
为了简化情况,如果你想从绿色显示紫色视图并且显示标签栏,你可以为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 之间的转场 link。这将保证橙色的是用绿色生产的。
实际上,这是一个技巧,您可以在两个选项卡上显示相同的 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 的精确方式。所以当你真正需要它们的时候,你可以选择它。