【问题标题】:Modal Controller is still top most view Controller when dismissed模态控制器在关闭时仍然是最顶层的视图控制器
【发布时间】:2020-04-21 04:33:07
【问题描述】:

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

尝试呈现 /SFSafariViewController: 0x10481a000/ on /ContainerController: 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
}

}

【问题讨论】:

  • 很难遵循结构的层次结构。你能发布更易读的格式吗?或分享您的层次结构的屏幕截图
  • 显示你的代码。
  • 我添加了一些代码,希望它能让我的问题更清楚!

标签: swift modal-dialog window hierarchy dismiss


【解决方案1】:

我终于通过将 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)
   }

而且效果很好! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多