Ios 使用后退按钮从NavigationController导航到另一个NavigationController

Ios 使用后退按钮从NavigationController导航到另一个NavigationController,ios,swift,uinavigationcontroller,storyboard,Ios,Swift,Uinavigationcontroller,Storyboard,你好,, 所以我有这个故事板结构,我在ViewController B中有一个按钮,我需要这个按钮指向底部的NavigationController,其中ViewController C作为rootViewController,所以当我按下ViewController B中的一个按钮时,它会将我带到C,现在我需要C上的一个后退按钮将我带回到B 我尝试过查找,但所有参考资料都显示了如何在ViewController而不是NavigationController之间导航。您可以使用单个导航控制器,但

你好,, 所以我有这个故事板结构,我在ViewController B中有一个按钮,我需要这个按钮指向底部的NavigationController,其中ViewController C作为rootViewController,所以当我按下ViewController B中的一个按钮时,它会将我带到C,现在我需要C上的一个后退按钮将我带回到B

我尝试过查找,但所有参考资料都显示了如何在ViewController而不是NavigationController之间导航。您可以使用单个导航控制器,但可以覆盖后退按钮操作

默认情况下,它将从导航堆栈中弹出当前视图控制器并转到上一个

在VC B中的后退操作中,只需按下VC C,您可以在故事板中通过从后退按钮拖放到VC C或通过编写以下代码来完成此操作:

self.navigationControlller.push(VC C)
如果无法避免使用2个NavigationController,则可以通过以下方式解决问题陈述

在UIButton的点击事件上的ViewControllerC中,在父navigationController中获取ViewControllerB的实例,然后像这样弹出到它

@objc func backAction() {
    let parentNav = self.navigationController?.navigationController
    if let vcB = parentNav?.viewControllers.first(where: { $0 is ViewControllerB }) {
        parentNav?.popToViewController(vcB, animated: true)
    }
}
将backAction添加到backButton的目标中,如

backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside)

我认为你不能把导航控制器放在另一个导航控制器内,但你也可以展示另一个导航控制器。 希望对你有用。 我已经创建了这样的简单演示。


将此代码放入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];

...

也许这不是最好的方法,但却是一种方法

为什么要使用第二个导航控制器?@RajeshKumarR我有一个LocationPicker ViewController,需要从NavigationController@Jhon你可以试试我的答案,它对你的项目有效我不能使用一个导航控制器我有一个位置选择器需要从NavigationControllerok的rootViewController打开的ViewController我尝试了它,并使用以下代码创建了一个后退按钮让backButton=UIButtontype:。自定义backButton.SetImageUIImageName:back_icon.png,用于:。普通backButton.setTitleBack,对于:.normal backButton.setTitleColorbackButton.tintColor,对于:.normal backButton.addTargetself,操作:backAction,对于:.touchUpInside self.navigationItem.leftBarButtonItem=UIBarbuttoneMcustomView:backButton,并在tap事件中添加了您的代码。它给出了一个错误,如发送到实例的“NSInvalidArgumentException”无法识别的选择器问题是因为方法及其选择器的签名不匹配。我已经更新了代码。我试过了,但是在我点击后退按钮后什么也没发生。导航2是什么?这里是第二个导航控制器的情节提要id吗?非常感谢。你能告诉我如何在ViewController上显示默认的后退按钮吗?你可以在navigationbar中放置barbutton项,但你必须将btnBack方法与之连接。你能分享一段代码片段吗?请告诉我如何做我对swiftLet我们来说是个新手。
...

//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];

...