Swift 如何使用iPadOS多窗口(SceneDelegate)获取rootViewController?

Swift 如何使用iPadOS多窗口(SceneDelegate)获取rootViewController?,swift,ios13,xcode11,uiscenedelegate,Swift,Ios13,Xcode11,Uiscenedelegate,我正在使用Xcode 11(beta3)并为iOS 13构建一个应用程序。在我的项目中,我为UIWindowSceneDelegate创建了委托方法,并在Info.plist中声明它。 现在我可以创建多个窗口(和UIScene) 现在我已经没有一个窗口了,如何访问rootViewController?我需要它来获取一些对象的引用和它所持有的边界 在我的AppDelegate窗口是nil,在我的ViewController(子视图控制器)实例中,我尝试使用self.view.window.root

我正在使用Xcode 11(beta3)并为iOS 13构建一个应用程序。在我的项目中,我为
UIWindowSceneDelegate
创建了委托方法,并在Info.plist中声明它。 现在我可以创建多个窗口(和UIScene)

现在我已经没有一个窗口了,如何访问rootViewController?我需要它来获取一些对象的引用和它所持有的边界

在我的AppDelegate
窗口是nil
,在我的ViewController(子视图控制器)实例中,我尝试使用
self.view.window.rootViewController
,但我发现
viewDidLoad()
太早了(我想),窗口仍然是nil,在
ViewDidAspect()
中工作,但我不需要每次视图控制器出现时都执行此过程

这种处理应用程序场景的新方法的最佳实践是什么

这是我的AppDelegate:

func应用程序(u应用程序:ui应用程序,
didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionKey:Any]?=nil)->Bool{
返回真值
}
func应用程序(u应用程序:ui应用程序,
连接场景会话的配置:UISceneSession,
选项:UIScene.ConnectionOptions)->UISceneConfiguration{
返回UISceneConfiguration(名称:“默认配置”,会话角色:ConnectionSceneSession.role)
}
我的领馆:

func场景(场景:UIScene,willConnectTo会话:UISceneSession,选项connectionOptions:UIScene.connectionOptions){
//是的,它是空的,我在用故事板
}

您可以使用以下方式访问连接的场景:

UIApplication.shared.connectedScenes
根据:

连接的场景是那些在内存中并可能执行活动工作的场景。连接的场景可能在前景或背景中,也可能在屏幕上或屏幕外

然后,您可以遍历它们,并尝试从中获取
UIWindowScene

guard let windowScene = (scene as? UIWindowScene) else { return }
print(windowScene.windows) // This will print windows associated with the scene.
另一方面,从视图控制器,您可以通过
视图访问
窗口

self.view.window

现在您有了多个rootViewController,每个场景一个。 首先,您必须在使用时回答您需要哪一个

您可能希望获取当前活动场景的一个rootViewController,然后可以使用:

        var rootVC:UIViewController? = nil
        if #available(iOS 13.0, *) {
            for scene in UIApplication.shared.connectedScenes {
                if scene.activationState == .foregroundActive {
                    rootVC = ((scene as? UIWindowScene)!.delegate as! UIWindowSceneDelegate).window!!.rootViewController
                    break
                }
            }
        } else {
            // Fallback on earlier versions
        }

windowScene
是否仅在当前场景中有值?说在同一个场景中可能有几个窗户。我不敢相信他们打破了一切。。。现在,顶部窗口是什么?如何添加一个位于所有内容顶部的UIView?我已经更新了答案。同时,我不会说有一个顶窗。可能有前台活动窗口或前台非活动窗口。看一看。它涵盖了多窗口UI背后的主体。我希望你会觉得它有用。