Ios 在不调用每个ViewDidDisplay的情况下解除对rootViewController的访问

Ios 在不调用每个ViewDidDisplay的情况下解除对rootViewController的访问,ios,swift,uinavigationcontroller,Ios,Swift,Uinavigationcontroller,我的视图控制器类似于MainView->NavigationController A->ViewController A->ViewController B->ViewController C,我想关闭ViewController(A、B和C)并再次显示MainView。。。我用这条线 self.view.window?.rootViewController?.dismiss(animated: false, completion: nil) 而且效果很好。。问题是,在关闭ViewContr

我的视图控制器类似于MainView->NavigationController A->ViewController A->ViewController B->ViewController C,我想关闭ViewController(A、B和C)并再次显示MainView。。。我用这条线

 self.view.window?.rootViewController?.dismiss(animated: false, completion: nil)

而且效果很好。。问题是,在关闭ViewController(A、B和C)时,它会调用每个ViewDidDisplay,并运行我不希望运行的代码。。在不调用每个viewController的情况下关闭并返回MainView的最佳做法是什么?以下是如何通过Sotryboard执行此操作。我不知道如何通过代码来做到这一点。我希望有帮助 在MainViewController中添加以下内容:

@IBAction func unwindToMainView(segue:UIStoryboardSegue) { }
在所有其他ViwController(视图控制器A、视图控制器B、视图控制器C)中, 像这样单击并拖动

然后选择您在mainVC中添加的segue

现在选择该序列并给它一个标识符

从这里,您可以在任何需要的地方使用该标识符执行segue。我用这个按钮来执行这个步骤


您必须有其他导致问题的代码

这是一个完整的例子

  • PresDisViewController
    是起始视图控制器
  • 其按钮创建一个导航控制器,其根为
    ViewControllerA
  • ViewControllerA
    有一个按钮可按下
    ViewControllerB
  • ViewControllerB
    有一个按钮可以按下
    ViewControllerC
  • ViewControllerC
    有一个按钮,可以执行您的
    self.view.window?.rootViewController?.dismission(动画:false,完成:nil)
每个VC实现
ViewDidAspect()
,并将自身打印到调试控制台

运行时的输出:

viewDidAppear scratchy.PresDisViewController
viewDidAppear scratchy.ViewControllerA
viewDidAppear scratchy.ViewControllerB
viewDidAppear scratchy.ViewControllerC
viewDidAppear scratchy.PresDisViewController
如您所见,当导航控制器关闭时,VCs中不会调用
viewdide

import UIKit

class ViewControllerA: UIViewController {

    let btn: UIButton = {
        let v = UIButton()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.setTitle("Do Push", for: .normal)
        v.backgroundColor = .red
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white

        view.addSubview(btn)

        NSLayoutConstraint.activate([
            btn.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -40.0),
            btn.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
        ])

        btn.addTarget(self, action: #selector(didTap(_:)), for: .touchUpInside)

    }

    @objc func didTap(_ sender: Any?) -> Void {
        let vc = ViewControllerB()
        self.navigationController?.pushViewController(vc, animated: true)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidAppear", NSStringFromClass(self.classForCoder))
    }

}

class ViewControllerB: UIViewController {

    let btn: UIButton = {
        let v = UIButton()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.setTitle("Do Push", for: .normal)
        v.backgroundColor = .systemYellow
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white

        view.addSubview(btn)

        NSLayoutConstraint.activate([
            btn.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0.0),
            btn.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
        ])

        btn.addTarget(self, action: #selector(didTap(_:)), for: .touchUpInside)

    }

    @objc func didTap(_ sender: Any?) -> Void {
        let vc = ViewControllerC()
        self.navigationController?.pushViewController(vc, animated: true)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidAppear", NSStringFromClass(self.classForCoder))
    }

}

class ViewControllerC: UIViewController {

    let btn: UIButton = {
        let v = UIButton()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.setTitle("Do Dismiss", for: .normal)
        v.backgroundColor = .blue
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white

        view.addSubview(btn)

        NSLayoutConstraint.activate([
            btn.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 40.0),
            btn.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
        ])

        btn.addTarget(self, action: #selector(didTap(_:)), for: .touchUpInside)

    }

    @objc func didTap(_ sender: Any?) -> Void {
        self.view.window?.rootViewController?.dismiss(animated: false, completion: nil)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidAppear", NSStringFromClass(self.classForCoder))
    }

}


class PresDisViewController: UIViewController {

    let btn: UIButton = {
        let v = UIButton()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.setTitle("Do Present", for: .normal)
        v.backgroundColor = .orange
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white

        view.addSubview(btn)

        NSLayoutConstraint.activate([
            btn.topAnchor.constraint(equalTo: view.topAnchor, constant: 60.0),
            btn.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
        ])

        btn.addTarget(self, action: #selector(didTap(_:)), for: .touchUpInside)

    }

    @objc func didTap(_ sender: Any?) -> Void {
        let vcA = ViewControllerA()
        let navVC = UINavigationController(rootViewController: vcA)
        navVC.modalPresentationStyle = .fullScreen
        present(navVC, animated: true, completion: nil)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidAppear", NSStringFromClass(self.classForCoder))
    }

}

@Sammy 1-我不使用故事板2-我将每个视图显示为全屏视图这是我转到ViewController A的代码让vc=ViewControllerA()让navigationController=UINavigationController(rootViewController:vc)navigationController.modalPresentationStyle=.fullScreen senderVC.present(navigationController,动画:true,完成:nil)