【问题标题】:Difference between SceneDelegate and AppDelegateSceneDelegate 和 AppDelegate 的区别
【发布时间】:2019-10-23 04:25:13
【问题描述】:

在我的 SwiftUI 项目中,我看到了 AppDelegate 文件以及 SceneDelegate 文件。

它们之间有什么区别?

例如SceneDelegate中的方法之间

scene(_:willConnectTo:options:)

AppDelegate

application(_:didFinishLaunchingWithOptions:)

【问题讨论】:

  • 根据谈话,他们从之前的 AppDelegate 的功能中分离出来。 SceneDelegate 专门负责管理活动窗口,包括显示视图。

标签: swift swiftui


【解决方案1】:

这两个文件旨在根据运行整个应用所需的内容以及支持在后台明显运行的“实例”所需的内容来拆分工作。这类似于配置一次数据库,但按窗口显示不同的值集。

您可以将它们视为全局和私有版本。一种是共享的,另一种仅限于个人所有者。在某种程度上,它们正是您所期望的名称。

正在支持多窗口

下次你创建一个新的 Xcode 项目时,你会看到你的 AppDelegate 分为两部分:AppDelegate.swift 和 SceneDelegate.swift。这是一个 iPadOS 带来的新的多窗口支持的结果,以及 有效地将应用委托的工作一分为二。

从 iOS 13 开始,您的应用代理应该:

  1. 设置应用程序运行期间所需的任何数据。
  2. 响应与应用相关的任何事件,例如与您共享的文件。
  3. 注册外部服务,例如推送通知。
  4. 配置您的初始场景。

相比之下,场景代理可以处理您的一个实例 应用程序的用户界面。所以,如果用户创建了两个窗口显示 你的应用,你有两个场景,都由同一个应用代理支持。

请注意,这些场景旨在独立于 彼此。因此,您的应用程序不再移动到后台, 但取而代之的是个别场景——用户可能会将一个场景移动到 背景,同时保持另一个打开。

感谢https://www.hackingwithswift.com/articles/193/whats-new-in-ios-13

【讨论】:

  • 如果我的应用只支持 iPhone 怎么办?
  • @ZaidPathan 正如文章所说,这只是 iPadOS 发布时添加的支持的结果
  • 我很好奇它是否会对 iPhone 应用程序的设计产生影响。我可以想象一个游戏,其中有一个菜单场景和另一个游戏场景。带有scenedelegate的不同窗口的另一个实际用途可以是电子商务应用程序的结帐......或者我错过了什么? :D
  • @lyzkov 我认为“场景”这个词可能让你感到困惑。此更改将需要与每个实例一起运行的应用程序委托的代码与只应为所有实例运行一次的代码分开。真的就这么简单。
  • 用户认证逻辑应该去哪里?根据有关“设置应用程序运行期间所需的任何数据”的声明,身份验证应进入 AppDelegate。但是初始应用程序入口逻辑只有在 SceneDelegate.scene 中才有效,所以我还必须在 SceneDelegate 中监听用户身份验证状态
【解决方案2】:

多平台

除了Abandoned Cart 的答案之外,从 Xcode 11 开始,您有一个名为 Multiplatform 的新选项可供选择作为起始模板。在那里你只会看到一个文件包含:

@main
struct MyMultiplatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

这就是系统如何知道从哪里开始使用@main 的代码(在 Swift 5.3 中),它包含在所有苹果平台上管理应用程序的多个窗口的 WindowGroup。所以你再也不用担心 SceneDelegate 和 AppDelegate 了。

如果你需要它像旧的应用程序代理一样,例如当你想使用它的方法时,你应该订阅相应的通知使用UIAppDelegateAdapter包装器I described here

【讨论】:

  • 你应该订阅相应的通知使用UIAppDelegateAdapter包装器,正如我描述的here@Ixx
猜你喜欢
  • 2021-08-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多