使用后退按钮从 NavigationController 导航到另一个 NavigationController
Navigate from NavigationController to another NavigationController with a back button
您好,
所以我有这个 storyboard
结构 我在 ViewController B
中有一个 button
我需要 button
指向底部 NavigationController
其中它有 ViewController C
作为 rootViewController
所以当我在 ViewContoller B
中按 button
时它会带我到 C
现在我需要 C
上的后退按钮让我回到B
我已经尝试查看,但所有参考资料都显示了如何在 ViewController
而非 NavigationControllers
之间导航
您可以使用单个导航控制器,但要覆盖后退按钮操作。
默认情况下,它会从导航堆栈中弹出当前视图控制器并转到上一个视图控制器。
在 VC B 中的 back 操作中,只需推送到 VC C,您可以通过从后退按钮到 VC C 或通过编写代码:
self.navigationControlller.push(VC C)
如果使用2navigationControllers
是无法避免的需求,可以通过以下方式解决问题陈述。
在 ViewControllerC
中的 UIButton's
点击事件中,在父 navigationController
中获取 ViewControllerB
的实例并像这样弹出它,
@objc func backAction() {
let parentNav = self.navigationController?.navigationController
if let vcB = parentNav?.viewControllers.first(where: { [=10=] is ViewControllerB }) {
parentNav?.popToViewController(vcB, animated: true)
}
}
将 backAction()
添加到 backButton's
目标,例如
backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside)
我认为您不能将 Navigation Controller 推入另一个 uinavigation 控制器,但您也可以提供另一个 nav 控制器。
希望对你有效。
我已经创建了这样的简单演示。
class ViewController: UIViewController {
@IBOutlet weak var btnCustom: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func btnForward(_ sender: Any) {
/*Uncomment the code if you want to present programatically*/
/*if let navi2 = self.storyboard?.instantiateViewController(withIdentifier: "nav2"){
self.present(navi2, animated: true) {
}
}*/
}
}
class ViewController2: UIViewController {
@IBOutlet weak var btnCustom: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnBack(_ sender: Any) {
if let parentNav = self.navigationController {
parentNav.dismiss(animated: true) {
}
}
}}
将此代码放入 C 的 viewController 后退按钮操作方法中。此外,您还必须在故事板屏幕中为您的视图提供标识符名称。
...
//It possible to change between different storyboards, but in your case all the views share the same storyboard.
UIStoryboard* storyboardOfA_B = [UIStoryboard storyboardWithName: @"storyboardOfA_B" bundle:nil];
UINavigationController* navigationControllerOfA_B = [storyboardOfA_B instantiateViewControllerWithIdentifier:@"navigationControllerOfA_B"];
UIViewController* viewControllerB = [storyboardOfA_B instantiateViewControllerWithIdentifier:@"viewControllerB"];
//I'm supposing that you have the action method of the back button in the C's view controller so I use self.
UINavigationController* navigationControllerOfC = self.navigationController;
[navigationControllerOfC pushViewController: navigationControllerOfA_B animated:NO];
[navigationControllerOfA_B pushViewController: viewControllerB animated:NO];
...
也许这不是最好的方式,但却是一种方式
您好,
所以我有这个 storyboard
结构 我在 ViewController B
中有一个 button
我需要 button
指向底部 NavigationController
其中它有 ViewController C
作为 rootViewController
所以当我在 ViewContoller B
中按 button
时它会带我到 C
现在我需要 C
上的后退按钮让我回到B
我已经尝试查看,但所有参考资料都显示了如何在 ViewController
而非 NavigationControllers
您可以使用单个导航控制器,但要覆盖后退按钮操作。
默认情况下,它会从导航堆栈中弹出当前视图控制器并转到上一个视图控制器。
在 VC B 中的 back 操作中,只需推送到 VC C,您可以通过从后退按钮到 VC C 或通过编写代码:
self.navigationControlller.push(VC C)
如果使用2navigationControllers
是无法避免的需求,可以通过以下方式解决问题陈述。
在 ViewControllerC
中的 UIButton's
点击事件中,在父 navigationController
中获取 ViewControllerB
的实例并像这样弹出它,
@objc func backAction() {
let parentNav = self.navigationController?.navigationController
if let vcB = parentNav?.viewControllers.first(where: { [=10=] is ViewControllerB }) {
parentNav?.popToViewController(vcB, animated: true)
}
}
将 backAction()
添加到 backButton's
目标,例如
backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside)
我认为您不能将 Navigation Controller 推入另一个 uinavigation 控制器,但您也可以提供另一个 nav 控制器。
希望对你有效。
我已经创建了这样的简单演示。
class ViewController: UIViewController {
@IBOutlet weak var btnCustom: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func btnForward(_ sender: Any) {
/*Uncomment the code if you want to present programatically*/
/*if let navi2 = self.storyboard?.instantiateViewController(withIdentifier: "nav2"){
self.present(navi2, animated: true) {
}
}*/
}
}
class ViewController2: UIViewController {
@IBOutlet weak var btnCustom: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnBack(_ sender: Any) {
if let parentNav = self.navigationController {
parentNav.dismiss(animated: true) {
}
}
}}
将此代码放入 C 的 viewController 后退按钮操作方法中。此外,您还必须在故事板屏幕中为您的视图提供标识符名称。
...
//It possible to change between different storyboards, but in your case all the views share the same storyboard.
UIStoryboard* storyboardOfA_B = [UIStoryboard storyboardWithName: @"storyboardOfA_B" bundle:nil];
UINavigationController* navigationControllerOfA_B = [storyboardOfA_B instantiateViewControllerWithIdentifier:@"navigationControllerOfA_B"];
UIViewController* viewControllerB = [storyboardOfA_B instantiateViewControllerWithIdentifier:@"viewControllerB"];
//I'm supposing that you have the action method of the back button in the C's view controller so I use self.
UINavigationController* navigationControllerOfC = self.navigationController;
[navigationControllerOfC pushViewController: navigationControllerOfA_B animated:NO];
[navigationControllerOfA_B pushViewController: viewControllerB animated:NO];
...
也许这不是最好的方式,但却是一种方式