(Swift) 弹回到导航控制器
(Swift) popping back to navigation controller
我会描述我想做什么。我有 3 个视图控制器。第一个应该是导航,我想我在代码中有错误。
第一个 VC 通向第二个,第二个 VC 通向第三个 VC.The 第三个有一个按钮可以返回到第一个。
这是我从第一个VC呈现第二个VC的方式VC:
let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let secondVC = (mainStoryboard.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController)
presentVC(SecondVC)
func presentVC(_ VC: UIViewController) {
let navController = UINavigationController(rootViewController: VC)
navController.modalPresentationStyle = .fullScreen
self.navigationController?.present(navController, animated: true, completion: nil)
}
现在在第二个 VC 中,当我在右侧 navBarItem 中单击 Close
时,第三个 VC 应该打开并且工作正常,这是代码:
在ViewDidLoad
中:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Close", style: .plain, target: self, action:
#selector(closeSecondVC))
之后:
@objc
func closeSecondVC() {
let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let thirdVC = (mainStoryboard.instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController)
presentVC(thirdVC) //Same function as above.
}
然后在这个按钮上单击第三个VC,我需要return到第一个VC,这就是我迷路的地方:
@IBAction func btnTapped(_ sender: Any) {
if let navController = self.navigationController {
navController.popViewController(animated: true)
} //nothing happens on click
}
在 btnTapped 中使用以下代码:
for controller in self.navigationController!.viewControllers as Array
{
// here YourViewController is your firstVC
if controller.isKind(of: YourViewController.self) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}
并且不要展示您的观点,将您的观点推向流行。
当您呈现任何视图控制器时,您需要关闭它而不是弹出!当你在那个时候推送任何视图控制器时你可以弹出但是在这里你呈现视图控制器在这种情况下你应该像下面那样关闭它,
dismiss(animated: true) {
}
或者您应该推送新的视图控制器然后弹出它!
您正在展示导航控制器,navController.popViewController()
将不起作用。
尝试使用
推送导航
self.navigationController?.pushViewController(vc, animated: true)
现在,如果您想从 ViewController3
转到 ViewController1
,请尝试
for controller in self.navigationController!.viewControllers as Array {
if !controller.isKind(of: ViewController1.self) {
self.navigationController!.popToViewController(controller, animated: true)
}
else{
break;
}
}
您需要调用它才能回到第一个 ViewController :
self.navigationController?.popToRootViewController(animated: true)
我会描述我想做什么。我有 3 个视图控制器。第一个应该是导航,我想我在代码中有错误。
第一个 VC 通向第二个,第二个 VC 通向第三个 VC.The 第三个有一个按钮可以返回到第一个。
这是我从第一个VC呈现第二个VC的方式VC:
let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let secondVC = (mainStoryboard.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController)
presentVC(SecondVC)
func presentVC(_ VC: UIViewController) {
let navController = UINavigationController(rootViewController: VC)
navController.modalPresentationStyle = .fullScreen
self.navigationController?.present(navController, animated: true, completion: nil)
}
现在在第二个 VC 中,当我在右侧 navBarItem 中单击 Close
时,第三个 VC 应该打开并且工作正常,这是代码:
在ViewDidLoad
中:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Close", style: .plain, target: self, action:
#selector(closeSecondVC))
之后:
@objc
func closeSecondVC() {
let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let thirdVC = (mainStoryboard.instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController)
presentVC(thirdVC) //Same function as above.
}
然后在这个按钮上单击第三个VC,我需要return到第一个VC,这就是我迷路的地方:
@IBAction func btnTapped(_ sender: Any) {
if let navController = self.navigationController {
navController.popViewController(animated: true)
} //nothing happens on click
}
在 btnTapped 中使用以下代码:
for controller in self.navigationController!.viewControllers as Array
{
// here YourViewController is your firstVC
if controller.isKind(of: YourViewController.self) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}
并且不要展示您的观点,将您的观点推向流行。
当您呈现任何视图控制器时,您需要关闭它而不是弹出!当你在那个时候推送任何视图控制器时你可以弹出但是在这里你呈现视图控制器在这种情况下你应该像下面那样关闭它,
dismiss(animated: true) {
}
或者您应该推送新的视图控制器然后弹出它!
您正在展示导航控制器,navController.popViewController()
将不起作用。
尝试使用
推送导航self.navigationController?.pushViewController(vc, animated: true)
现在,如果您想从 ViewController3
转到 ViewController1
,请尝试
for controller in self.navigationController!.viewControllers as Array {
if !controller.isKind(of: ViewController1.self) {
self.navigationController!.popToViewController(controller, animated: true)
}
else{
break;
}
}
您需要调用它才能回到第一个 ViewController :
self.navigationController?.popToRootViewController(animated: true)