SceneDelegate 设置 UIWindow 的方式

275 阅读1分钟

SceneDelegate 根据之前的操作,删除了默认的window,所以需要手动生成新的window

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        // ⚠️ 因为 第一步取消了默认配置文件window 就变成了nil 这里做一个验证
        //所以 需要自己赋值window 并且关联 windowScene
        if (window == nil) {
            print("window => nil")
        }

        // 系统默认代码
        //guard let _ = (scene as? UIWindowScene) else { return }
        //将UIWindowScene实例化
        // 这里给需要用到的 win scene 改个名
        guard let windowScene = (scene as? UIWindowScene) else { return }

        // 实例化新的 window 视图窗口 => uiwindow 本质是个 uiview 而已
        // 另外这里需要关联当前系统给到的场景 windowScene
        // 至于这些什么场景 视图 啥的都是苹果为了开发程序弄出来的概念跟结构
        let newWindow = UIWindow(windowScene: windowScene)
//        let newWindow = UIWindow(frame: UIScreen.main.bounds) 无法显示 因为没有附着到场景 scene 里面

        // 实例化新的 vc
        let vc = AAViewController()
        
        // 设置 vc 掌管的 view 的 bgColor
        vc.view.backgroundColor = .cyan
        
        // 设置新window 的 根部视图控制器
        newWindow.rootViewController = vc

        // 让新窗口可见
        newWindow.makeKeyAndVisible()

        // 赋值系统因为配置文件取消 赋值 nil 的 window 属性为新的自己实例化的启动窗口视图(!!!记住本质是 uiview)
        window = newWindow

        
        /*⚠application => 
         scene 场景 => 
         场景下面分属 window 视图窗口 => 
         每个 window 下面掌管 vc 里面的 view, vc 的存在不过是调用业务逻辑更新里面的 view, 这个 view 又会嵌套在 window 上显示, 后面 vc 这玩意会在 SwiftUI 框架里被消灭, 因为后面都流行 mvvm 的架构
         */
    }