Swift在SceneDelegate中设置新window 的根部视图控制器 来取代Main.storyboaed

1,507 阅读2分钟

做法:先摆出来,分割线之后再分析

1、删除

image.png

image.png

image.png

2、在SceneDelegate中

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        let newWindow = UIWindow(windowScene: windowScene)
        let vc = PicturePickerController()
        vc.view.backgroundColor = .cyan
        newWindow.rootViewController = vc
        newWindow.makeKeyAndVisible()
        window = newWindow
    }

3、为了验证,可以在ViewController里面打印

print("View did load default")

image.png


接下来仔细分析

这里借用某位IOS大神的代码,也是他帮助我填补了这段知识盲区,感激不尽

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 的架构
         */
    }

后续学习:

juejin.cn/post/684490…