ios - 在 iOS 13 中获取 Root View Controller 的正确方法是什么?

class TopViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //Code Block 1
        let controller = getTopController()
        print(controller)// Prints out MyTestProject.TopViewController

        //Code Block 2
        let controller2 = getRootController()
        print(controller2)//Prints out nil , because keywindow is also nil upto this point.

        //Code Block 3
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) {
            let controller2 = self.getRootController()
            print(controller2)// Prints out MyTestProject.TopViewController   
        }
    }

    func getTopController() -> UIViewController? {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
            let sceneDelegate = windowScene.delegate as? SceneDelegate else {
                return nil
        }
        return sceneDelegate.window?.rootViewController
    }

    func getRootController() -> UIViewController? {
        let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
        let topController = keyWindow?.rootViewController
        return topController
    }
}

自 iOS 13 以来,有两种方法可以获取应用程序的当前事件/顶部 View Controller 。 这里: getTopController() 和 getRootController() 展示了这两种方法。

正如代码中所评论的,除了 print() 结果是不同的。

在代码块 2 中: getRootController 还找不到窗口,所以它打印出 nil。为什么会这样?

另外,在iOS 13中获取top controller引用的完整证明方法是什么,我现在很困惑?

最佳答案

问题是当你的 View Controller viewDidLoad window.makeKey() 还没有被调用时。

一个可能的解决方法是,如果关键窗口不可用,则获取 windows 数组中的第一个窗口。

    func getRootController() -> UIViewController? {
        let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) ?? UIApplication.shared.windows.first
        let topController = keyWindow?.rootViewController
        return topController
    }

请注意,这将解决您的问题,但您应该推迟任何涉及使用按键窗口的操作,直到它出现为止。

关于ios - 在 iOS 13 中获取 Root View Controller 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61725562/

相关文章:

google-app-engine - 如何使用 Google Cloud Tasks 扩展拉取队列

html - 如何在没有 JavaScript 的情况下设置 CSS 动画速度?

c# - w[警告]未找到测试结果文件 azure devops

kubernetes - 无法从普罗米修斯适配器检索自定义指标

java - Netbeans 中的 JUnit 5 测试

python - 你如何使用 python-rtmidi 获取 midi 事件

spring-boot - 如何将Keycloak注册到Spring Eureka Server

laravel - Firefox 无法与 wss ://127. 0.0.1 的服务器建立连接

css - 有没有办法使用变换比例使内容自动适合父 div?

python - 包含 json 格式列的 Dask 数据框