如何在 Swift iOS 中关闭 2 个视图控制器?
下面是我的代码。
@IBAction func backButtonTapped(sender: AnyObject) {
self.presentingViewController
.presentingViewController
.dismissViewControllerAnimated(true, completion: nil)
}
如何在 Swift iOS 中关闭 2 个视图控制器?
下面是我的代码。
@IBAction func backButtonTapped(sender: AnyObject) {
self.presentingViewController
.presentingViewController
.dismissViewControllerAnimated(true, completion: nil)
}
斯威夫特 3+ 版本。您可以使用以下代码在 Swift 3 中一次关闭两个视图控制器。
func dismissTwoViews() {
self.presentingViewController?
.presentingViewController?.dismiss(animated: true, completion: nil)
}
斯威夫特 4+ 版本。只是我们需要弹出特定的视图控制器使用这个扩展
extension UINavigationController {
func popToViewController(ofClass: AnyClass, animated: Bool = true) {
if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
popToViewController(vc, animated: animated)
}
}
func popViewControllers(viewsToPop: Int, animated: Bool = true) {
if viewControllers.count > viewsToPop {
let vc = viewControllers[viewControllers.count - viewsToPop - 1]
popToViewController(vc, animated: animated)
}
}
}
并在您的视图控制器类中像这样使用
for controller in self.navigationController!.viewControllers as
Array {
if controller.isKind(of:
yourPopControllerName.self) {
self.navigationController?.isNavigationBarHidden = false
_ =
self.navigationController!.popToViewController(controller,
animated: false)
break
}
}
为此目的,有一个特殊的unwind segue,它旨在回滚到堆栈中的某个视图控制器。
让我们将最顶层的控制器(您从哪里来)称为source,并将堆栈中的控制器(您想要回滚到顶部)称为destination。
IBAction
在目标位置创建以在展开 segue 时触发:
@IBAction func myUnwindAction(segue: UIStoryboardSegue) {}
它可以是空的。
在源控制器中,通过从控制器图标拖动退出一个来创建一个展开 segue,它将找到您在步骤 1 中创建的动作。调用 segue unwind
。
现在你可以用常规的代码从代码中发出那个segue
performSegueWithIdentifier("unwind", sender: nil)
我描述了如何从代码中发出 unwind segue。对于按钮展开 segues 可以通过拖动按钮退出图标直接在 IB 中创建。
另请查看此讨论以获取更多信息:如何以编程方式执行 Unwind segue?
您一次只能关闭一个视图控制器。尝试这个
@IBAction func backButtonTapped(sender: AnyObject) {
self.presentingViewController?.dismissViewControllerAnimated(true, completion: {
let secondPresentingVC = self.presentingViewController?.presentingViewController;
secondPresentingVC?.dismissViewControllerAnimated(true, completion: {});
});
}
斯威夫特 4:
为 UIViewController 创建了一个扩展,可以根据提供的次数在 NavigationController 堆栈中弹出 UIViewController
extension UIViewController {
func pop(numberOfTimes: Int) {
guard let navigationController = navigationController else {
return
}
let viewControllers = navigationController.viewControllers
let index = numberOfTimes + 1
if viewControllers.count >= index {
navigationController.popToViewController(viewControllers[viewControllers.count - index], animated: true)
}
}
}