如何回到初始ViewController的正确方法?

How to go back to the initial ViewController the right way?

我有几个带有导航栏和标签栏的视图控制器。然后我有一个没有导航栏和标签栏的初始视图控制器。我想回到堆栈中没有其他视图控制器的初始视图控制器。这是我的做法:

// Head back to Initial View Controller.
let initialViewController = self.storyboard!.instantiateViewController(withIdentifier: "Initial")
UIApplication.shared.keyWindow?.rootViewController = initialViewController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = initialViewController

这非常有效。但随后它不会再次从初始视图控制器移动到另一个视图控制器。例如:

@IBAction func loginButton(_ sender: Any) {
    print("Login Button Tapped.")

    let storyboard = UIStoryboard(name: "SignInViewController", bundle: nil)
    let signInViewController = storyboard.instantiateViewController(withIdentifier: "SignInViewController") as! SignInViewController
    self.navigationController?.show(signInViewController, sender: nil)

}

这里打印语句是运行,但是self.navigationController.show不会。这一切是如何运作的?实现这一目标的正确方法是什么?

编辑:

为避免混淆,这是我的故事板。最左边的 viewcontroller (粉红色屏幕)是我要返回的初始视图控制器。同一层最右边是我要返回的视图。

self.navigationController.popToRootViewController(animated:) 就是您要找的。

https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621855-poptorootviewcontroller

编辑

尝试在调用 popToRoot 后关闭 navigationControllerself.navigationController.dismiss(animated: true, completion: nil)

编辑

尝试以下操作:

@IBAction func loginButton(_ sender: Any) {
    print("Login Button Tapped.")

    let storyboard = UIStoryboard(name: "SignInViewController", bundle: nil)
    let signInViewController = storyboard.instantiateViewController(withIdentifier: "SignInViewController") as! SignInViewController
    present(signInViewController, animated: true, completion: nil)
    //self.navigationController?.show(signInViewController, sender: nil)
}

然后从 signInViewController.

中关闭 signInViewController 调用 self?.navigationController.dismiss(animated:true, completion:nil)

它不会移动到另一个视图控制器,因为您在 rootViewController 中设置了一个简单的视图控制器。

您需要的是:

let initialViewController = self.storyboard!.instantiateViewController(withIdentifier: "Initial")
let navController = UINavigationController.init(rootViewController: initialViewController)

UIApplication.shared.keyWindow?.rootViewController?.present(navController, animated: true, completion: nil)

这将创建一个 navigationviewcontroller,因此在 "Initial" 上您应该能够执行推送,显示另一个视图控制器的操作。

从您的初始视图控制器,您需要实例化您的导航堆栈并模态呈现它。然后,当您想返回导航前的初始 VC 时,只需调用 dismiss(animated:,completion:),这将关闭您的 整个 导航堆栈和 return 你到初始视图控制器。