Swift iOSで2つのビューコントローラーを閉じる方法は?
以下は私のコードです。
@IBAction func backButtonTapped(sender: AnyObject) {
self.presentingViewController
.presentingViewController
.dismissViewControllerAnimated(true, completion: nil)
}
Swift 3+バージョン。以下のコードを使用すると、Swift 3で一度に2つのViewControllerを閉じることができます。
func dismissTwoViews() {
self.presentingViewController?
.presentingViewController?.dismiss(animated: true, completion: nil)
}
Swift 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があり、スタック内の特定のViewControllerにロールバックすることを目的としています。
最上位のコントローラー(移動元)をsourceと呼び、スタック内のコントローラー(最上位にロールバックする)をdestinationと呼びましょう。
IBAction
in destinationを作成して、アンワインドセグエでトリガーします。
@IBAction func myUnwindAction(segue: UIStoryboardSegue) {}
空にすることができます。
sourceコントローラーは、コントローラーアイコンからドラッグしてアンワインドセグエを作成し、終了します。ステップ1で作成したアクションが見つかります。セグエunwind
を呼び出します。
今、あなたは定期的にコードからそのセグエを発行することができます
performSegueWithIdentifier("unwind", sender: nil)
コードからアンワインドセグエを発行する方法を説明しました。ボタンのアンワインドセグエは、ボタンをドラッグしてアイコンを終了することにより、IBで直接作成できます。
詳細については、このディスカッションも確認してください。 プログラムでUnwindセグエを実行する方法は?
一度に閉じることができるViewControllerは1つだけです。これを試して
@IBAction func backButtonTapped(sender: AnyObject) {
self.presentingViewController?.dismissViewControllerAnimated(true, completion: {
let secondPresentingVC = self.presentingViewController?.presentingViewController;
secondPresentingVC?.dismissViewControllerAnimated(true, completion: {});
});
}
Swift 4:
提供された回数に応じてNavigationControllerスタックにUIViewControllerをポップできる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)
}
}
}