使用后退按钮从 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];

...

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