如何在 iOS 14 @main 文件中获取 UIWindow 值?

Posted

技术标签:

【中文标题】如何在 iOS 14 @main 文件中获取 UIWindow 值?【英文标题】:How to get UIWindow value in iOS 14 @main file? 【发布时间】:2020-06-30 07:41:58 【问题描述】:

我可以通过以下实现访问 didFinishLaunchingWithOptions。但是,我需要 UIWindow 变量。我不知道如何得到它。我正在使用 Xcode 12 测试版。 ios14,SwiftUI 生命周期。


import SwiftUI

@main
struct SSOKit_DemoApp: App 
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene 
        WindowGroup 
            ContentView()
        
    


class AppDelegate: NSObject, UIApplicationDelegate 
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool 
        
        print("hello world!!!")
        return true
    

【问题讨论】:

当时还没有窗口,为什么需要呢? 我想集成一个sso sdk。我们需要使用 UIWindow(根视图控制器)初始化 sdk。以前(swift ui 1.0)我从 SceneDelegate 获得了 UIWindow。 【参考方案1】:

从 iOS 13 开始,可以安全地假设获取对关键窗口的引用的正确方法是通过 UIWindowSceneDelegate

@main
struct DemoApp: App 
    
    var window: UIWindow? 
        guard let scene = UIApplication.shared.connectedScenes.first,
              let windowSceneDelegate = scene.delegate as? UIWindowSceneDelegate,
              let window = windowSceneDelegate.window else 
            return nil
        
        return window
    

    [...]

【讨论】:

太棒了?。谢谢? 这可能只有在只有一个窗口和一个场景的情况下才有效。也就是说,它不适用于 iPad 或 macOS 上的多任务处理。【参考方案2】:

iOS 14.7

@main
struct TestApp: App 

    var window: UIWindow? 
        guard let scene = UIApplication.shared.connectedScenes.first,
              let windowScene = scene as? UIWindowScene else 
            return nil
        
    
        return .init(windowScene: windowScene)
    

【讨论】:

请添加一些解释。

以上是关于如何在 iOS 14 @main 文件中获取 UIWindow 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 UI 测试(Xcode 12、iOS14)访问推送通知?

如何将变量从 PyQt5 UI 返回到 Main 函数 - Python

如何在 vscode 中使用自己的 javascript 文件获取智能感知

Swift UI 2 DocumentGroup 获取导航栏按钮操作

iOS UI 测试:如何获取 UIAlertController 的消息

如何获取导入的类以更改 main.py 标签样式表的属性 [关闭]