Swift 如何使用iPadOS多窗口(SceneDelegate)获取rootViewController?
我正在使用Xcode 11(beta3)并为iOS 13构建一个应用程序。在我的项目中,我为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
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背后的主体。我希望你会觉得它有用。