web-dev-qa-db-ja.com

Swift iosで2つのビューコントローラーを閉じる方法は?

Swift iOSで2つのビューコントローラーを閉じる方法は?

以下は私のコードです。

@IBAction func backButtonTapped(sender: AnyObject) {
    self.presentingViewController
        .presentingViewController
        .dismissViewControllerAnimated(true, completion: nil)
}
10
viju

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
                                }
                            }
11

その目的のために特別なunwind segueがあり、スタック内の特定のViewControllerにロールバックすることを目的としています。

最上位のコントローラー(移動元)をsourceと呼び、スタック内のコントローラー(最上位にロールバックする)をdestinationと呼びましょう。

  1. IBAction in destinationを作成して、アンワインドセグエでトリガーします。

    @IBAction func myUnwindAction(segue: UIStoryboardSegue) {}

空にすることができます。

  1. sourceコントローラーは、コントローラーアイコンからドラッグしてアンワインドセグエを作成し、終了します。ステップ1で作成したアクションが見つかります。セグエunwindを呼び出します。

  2. 今、あなたは定期的にコードからそのセグエを発行することができます

    performSegueWithIdentifier("unwind", sender: nil)

コードからアンワインドセグエを発行する方法を説明しました。ボタンのアンワインドセグエは、ボタンをドラッグしてアイコンを終了することにより、IBで直接作成できます。

詳細については、このディスカッションも確認してください。 プログラムでUnwindセグエを実行する方法は?

11
Mixaz

一度に閉じることができるViewControllerは1つだけです。これを試して

@IBAction func backButtonTapped(sender: AnyObject) {
        self.presentingViewController?.dismissViewControllerAnimated(true, completion: {
            let secondPresentingVC = self.presentingViewController?.presentingViewController;
            secondPresentingVC?.dismissViewControllerAnimated(true, completion: {});
        });
}
1
Stefan Iarca

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)
        }
    }
}
0