如何在导航控制器中同时执行模态segue和pop?

时间:2018-01-17 00:48:29

标签: ios iphone swift uinavigationcontroller modalviewcontroller

我想弹出窗帘后面的根,同时以模态方式呈现一个新的视图控制器。当用户完成这个新的视图控制器时,它将被解除,并且navigationcontroller的根视图控制器将在它后面。

我尝试过使用

self.navigationController?.popToRootViewController(animated: false)

prepareForSegue:方法内,但它在模态视图控制器完全呈现之前显示了根视图控制器(因此向用户显示窗帘背后发生了什么,这不是一个理想的特征)。

如果尝试弹出模态显示的视图控制器的viewDidLoad:,则根本不会发生任何事情。

解决此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

扭转局面并同时解除模态加popToRootViewController

不确定你是否可以使用StoryBoards(因为我更像是一个XIB人),所以你可能需要更多的代码。

答案 1 :(得分:0)

有很多不同的方法可以实现这一目标。这个将通过委托在后台弹出FirstViewController。

class FirstViewController: UIViewController {

    @IBOutlet weak var presentModal: UIBarButtonItem!

    @IBAction func action(_ sender: Any) {
        self.performSegue(withIdentifier: "presentModal", sender: nil)

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "presentModal" {
            let destVC = segue.destination as! UINavigationController
            let topVC = destVC.topViewController as! SecondViewController
            topVC.delegate = self
        }
    }


}

extension FirstViewController: SecondViewControllerDelegate {

    func didDismissModal(_ controller: SecondViewController) {
        self.navigationController?.popViewController(animated: false)
    }

}

protocol SecondViewControllerDelegate {
    func didDismissModal(_ controller: SecondViewController)
}

class SecondViewController: UIViewController {

    var delegate: SecondViewControllerDelegate?

    @IBAction func action(_ sender: Any) {
         self.delegate?.didDismissModal(self)
         self.dismiss(animated: true, completion: nil)
    }

}