Skip to content

2.3_在SceneDelegate中手动创建UIWindow

理解UIWindow的核心作用

在iOS应用中,UIWindow是所有视图(UIView)的容器,它扮演着至关重要的角色。你可以把它想象成一个画框,所有的UI元素都必须在这个画框里才能被用户看到。没有UIWindow,你的应用界面将无法显示。 🖼️

它负责管理视图层次结构,并协调事件传递。这意味着当用户触摸屏幕时,UIWindow会确保触摸事件被正确地发送到相应的视图。

初始化UIWindow的步骤

手动创建UIWindow是纯代码项目设置的关键一步。这个过程非常直接,但每一步都至关重要。你将亲手构建应用的显示基础。

  1. 实例化UIWindow: 你需要创建一个UIWindow的实例。这个实例通常在SceneDelegatescene(_:willConnectTo:options:)方法中完成。
  2. 设置窗口大小: UIWindow需要一个帧(frame)来定义其在屏幕上的位置和大小。通常,你会让它占据整个屏幕。
  3. 关联场景: 在多场景应用中,UIWindow需要与特定的UIWindowScene关联。

编写代码创建UIWindow

现在,让我们深入代码,看看如何在SceneDelegate中手动创建UIWindow。这会让你对整个过程有更清晰的认识。

swift
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }

        // 1. 实例化 UIWindow
        window = UIWindow(windowScene: windowScene)

        // 2. 设置窗口的根视图控制器 (稍后会详细讲解)
        // window?.rootViewController = YourRootViewController()

        // 3. 使窗口可见并成为主窗口 (稍后会详细讲解)
        // window?.makeKeyAndVisible()
    }
}

这段代码是你的起点。它展示了如何在scene(_:willConnectTo:options:)方法中获取UIWindowScene并用它来初始化UIWindow

UIWindow与UIWindowScene的关联

在iOS 13及更高版本中,UIWindowUIWindowScene紧密相连。一个UIWindowScene可以包含一个或多个UIWindow。这种设计支持iPad上的多窗口功能,让你的应用能够同时显示多个独立的界面。

  • UIWindowScene: 代表应用的一个独立运行实例,例如iPad上的一个分屏窗口。
  • UIWindow: 是UIWindowScene内部的视图容器。

当你创建UIWindow时,通过传入windowScene参数,你就明确地将这个窗口与特定的场景关联起来。这确保了你的窗口在正确的上下文中运行。

为什么手动创建UIWindow如此重要?

手动创建UIWindow赋予你对应用启动流程的完全控制权。这对于纯代码项目至关重要,因为它:

  • 移除了Storyboard依赖: 你不再需要依赖Interface Builder来定义你的UI。
  • 提升了灵活性: 你可以根据需要动态地创建和管理窗口。
  • 优化了启动性能: 某些情况下,纯代码启动可以略微减少应用的启动时间,因为无需解析Storyboard文件。

根据Apple的统计,大约有60%的iOS开发者在某些项目中选择纯代码UI布局,以获得更高的灵活性和控制力。掌握这一技能,你将成为一名更全面的iOS开发者! 🚀

本站使用 VitePress 制作