Swift 禁用时,模态控制器仍然是最顶层的视图控制器

Swift 禁用时,模态控制器仍然是最顶层的视图控制器,swift,modal-dialog,window,hierarchy,dismiss,Swift,Modal Dialog,Window,Hierarchy,Dismiss,我必须查看控制器:ContainerController、主viewController和VC2。VC2是从集装箱控制器以模态方式呈现的。当点击VC2中的按钮时,VC2被解除,我们回到ContainerController。但看起来,即使被排除,最顶层的视图控制器仍然是VC2,而不是ContainerController。为什么会这样? 然后,当我尝试呈现一个类似SFsafaryVC的vc时,我得到一个错误: 尝试显示/SFSafariViewController:0x10481a000/on

我必须查看控制器:ContainerController、主viewController和VC2。VC2是从集装箱控制器以模态方式呈现的。当点击VC2中的按钮时,VC2被解除,我们回到ContainerController。但看起来,即使被排除,最顶层的视图控制器仍然是VC2,而不是ContainerController。为什么会这样? 然后,当我尝试呈现一个类似SFsafaryVC的vc时,我得到一个错误:

尝试显示/SFSafariViewController:0x10481a000/on /集装箱控制器:0x1110074c0/其视图不在窗口中 等级制度

如何从最顶端的视图控制器中删除VC2?或者我怎样才能使ContainerController回到堆栈顶部

下面是一些代码:

集装箱控制器:

class ContainerController: UIViewController {


 var isBackFromCV2: Bool = false

  override func viewDidLoad() {
        super.viewDidLoad()
        if isBackFromCV2 {
          backFromVC2()
          }
  }
[...]

func toVC2() {
let vc = VC2()
self.present(vc, animated: true)
}

func backFromVC2() {
//some code for azure client login using SFSafariVC - needs to be presented from ContainerController
client.login(withProvider: "", urlScheme: "myApp", controller: self, completion: loginBlock)

//I tried to get the topController to check which controller is presenting
        if var topController = UIApplication.shared.keyWindow?.rootViewController
            {
              while (topController.presentedViewController != nil)
              {
                topController = topController.presentedViewController!
                print(topController) //always prints VC2
              }
            }
 }
}
和VC2:

class VC2 : UIViewController {
let containerController = ContainerController()
[...]

func onClick() {
  self.dismiss(animated: true, completion: nil)
  self.containerController.isBackFromVC2 = true
}

}

通过将rootViewController设置为ContainerController,我最终解决了这个问题

在集装箱控制器中:

func backFromVC2() {

  let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
  appDelegate.window?.rootViewController = self
  client.login(withProvider: "yourProvider", urlScheme: "myApp", controller: self, completion: loginBlock)
   }

而且效果很好!:)

很难遵循结构的层次结构。你能发布一个更可读的格式吗?或者分享你的继承人的截图展示你的代码。我添加了一些代码,希望它能让我的问题更清楚!