如何以正确的方式回到最初的ViewController?

时间:2017-07-19 17:34:22

标签: ios swift viewcontroller rootview popviewcontroller

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

// 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)

}

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

修改

enter image description here

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

3 个答案:

答案 0 :(得分:1)

它不会移动到另一个视图控制器,因为您在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”时,您应该能够执行其他视图控制器的push,present动作。

答案 1 :(得分:0)

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

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

修改

在致电navigationController后尝试解除popToRootself.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内删除self?.navigationController.dismiss(animated:true, completion:nil)来电signInViewController

答案 2 :(得分:0)

从初始视图控制器,您需要实例化导航堆栈并以模拟方式显示它。然后,当您想要返回导航前的初始VC时,只需致电dismiss(animated:,completion:),这将解除您的整个导航堆栈并返回初始视图控制器。