iOS中的UIScene和UISceneDelegate

目录

​​​​​​​前言

一、AppDelegate和SceneDelegate的关系

1.AppDelegate

2.SceneDelegate

3.info.plist配置

4.生命周期方法对比

1.应用启动

2.进入前台

3.进入后台

5.何时使用AppDelegate和SceneDelegate

1.AppDelegate

2.SceneDelegate


前言

        在iOS 13及之后的版本中,苹果引入了UISceneUISceneDelegate,将应用程序的生命周期管理分成了多个场景(Scene),使得多窗口支持成为可能。SceneDelegateAppDelegate 分别负责不同方面的应用程序生命周期和 UI 管理。

        这篇博客主要介绍UISceneDelegate以及相关API的用法。

一、AppDelegate和SceneDelegate的关系

1.AppDelegate

        1.主要用于处理应用程序级别的事件,如应用程序启动、终止、进入前台和后台等。

        2.在iOS 13之前,AppDelegate负责所有应用程序生命周期的管理

2.SceneDelegate

        1.引入于iOS 13,用于管理单个窗口或场景的生命周期。

        2.一个应用程序可以有多个SceneDelegate实例,每个实例对应一个窗口或场景

        3.主要用于处理与UI相关的生命周期事件,例如场景的创建、进入前台、进入后台等

   AppDelegate实例如下:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    // 应用程序启动时调用
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 初始化代码
        return true
    }

    // 应用程序进入后台时调用
    func applicationDidEnterBackground(_ application: UIApplication) {
        // 保存数据或释放资源
    }

    // 应用程序进入前台时调用
    func applicationWillEnterForeground(_ application: UIApplication) {
        // 恢复数据或资源
    }
    
    // 更多方法...
}

   SceneDelegate实例如下:

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 }
        window = UIWindow(windowScene: windowScene)
        window?.rootViewController = ViewController()  // 设置根视图控制器
        window?.makeKeyAndVisible()
    }

    // 场景进入前台时调用
    func sceneWillEnterForeground(_ scene: UIScene) {
        // 恢复数据或资源
    }

    // 场景进入后台时调用
    func sceneDidEnterBackground(_ scene: UIScene) {
        // 保存数据或释放资源
    }
    
    // 更多方法...
}

3.info.plist配置

        要使SceneDelegate生效,需要在Info.plist中进行配置:

<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <true/>
    <key>UISceneConfigurations</key>
    <dict>
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>Default Configuration</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
            </dict>
        </array>
    </dict>
</dict>

4.生命周期方法对比

1.应用启动

        AppDelegate: application(_:didFinishLaunchingWithOptions:)
       SceneDelegate: scene(_:willConnectTo:options:)

2.进入前台

        AppDelegate: applicationWillEnterForeground(_:)
          SceneDelegate: sceneWillEnterForeground(_:)

3.进入后台

        AppDelegate: applicationDidEnterBackground(_:)
        SceneDelegate: sceneDidEnterBackground(_:)

5.何时使用AppDelegate和SceneDelegate

1.AppDelegate

 - 处理应用程序级别的事件,如推送通知的注册、处理快捷方式、全局状态保存等。
  - 与应用程序生命周期无关的设置和初始化。

2.SceneDelegate

 - 处理与单个UI场景相关的事件,如窗口管理、多任务处理等。
  - 每个窗口或场景特定的UI状态管理。

通过引入`SceneDelegate`,苹果提供了更好的方式来管理iPad的多窗口支持,并且更清晰地分离了应用程序的生命周期事件和UI相关的生命周期事件。这有助于开发者更好地组织代码并支持复杂的应用程序功能。

相关推荐

  1. iOSUISceneUISceneDelegate

    2024-06-06 07:30:05       28 阅读
  2. mysqlINNOT IN

    2024-06-06 07:30:05       29 阅读
  3. FPGA IOEIO BANK

    2024-06-06 07:30:05       26 阅读
  4. iOS@objc@objcMembers实现SwiftOC交互

    2024-06-06 07:30:05       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 07:30:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 07:30:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 07:30:05       87 阅读
  4. Python语言-面向对象

    2024-06-06 07:30:05       96 阅读

热门阅读

  1. Android AAudio——音频流释放死锁(七)

    2024-06-06 07:30:05       30 阅读
  2. Python中的上下文管理:深入探索contextlib模块

    2024-06-06 07:30:05       27 阅读
  3. centos系统编译openssl和openssl-lib的rpm安装包

    2024-06-06 07:30:05       22 阅读
  4. godot.bk2

    godot.bk2

    2024-06-06 07:30:05      30 阅读
  5. Git commit规范

    2024-06-06 07:30:05       24 阅读
  6. 入门级python编程题(12)洛谷(分类平均)

    2024-06-06 07:30:05       20 阅读
  7. Chatgpt-4o:人工智能领域的革新与未来展望

    2024-06-06 07:30:05       34 阅读
  8. 提交一个Bug需要哪些信息?

    2024-06-06 07:30:05       27 阅读
  9. PSOPT在Ubuntu22.04下的安装

    2024-06-06 07:30:05       29 阅读