如何回到初始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:)
就是您要找的。
编辑
尝试在调用 popToRoot
后关闭 navigationController
。
self.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 你到初始视图控制器。
我有几个带有导航栏和标签栏的视图控制器。然后我有一个没有导航栏和标签栏的初始视图控制器。我想回到堆栈中没有其他视图控制器的初始视图控制器。这是我的做法:
// 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:)
就是您要找的。
编辑
尝试在调用 popToRoot
后关闭 navigationController
。
self.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 你到初始视图控制器。