当前位置: 首页 > 面试题库 >

支持iOS 12和13时的AppDelegate和SceneDelegate

郑曜灿
2023-03-14
问题内容

我需要支持iOS 12和iOS 13。

我应该在AppDelegate和之间复制代码SceneDelegate吗?

例如:

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

    window.rootViewController = HomeViewController()
    window.makeKeyAndVisible()

    self.window = window
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let window = UIWindow(frame: UIScreen.main.bounds)
    window.rootViewController = HomeViewController()
    window.makeKeyAndVisible()

    self.window = window

    return true
}

如果我不这样做,则在1个版本中,我最终会出现黑屏,但是如果我这样做并以的viewDidLoad方式打印,则HomeViewController可以看到它被称为两次。

我进行了更新didFinishLaunchingWithOptions,可以看到iOS13它仍然被调用了两次。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    guard #available(iOS 12, *) else { return true }

    let window = UIWindow(frame: UIScreen.main.bounds)
    window.rootViewController = HomeViewController()
    window.makeKeyAndVisible()

    self.window = window

    return true
}

问题答案:

您确实需要复制代码,但需要确保它仅在正确的系统上运行。在iOS
13中,您不希望该应用程序委托didFinishLaunching主体代码运行,因此请使用可用性检查来阻止它。以相同的方式,使用可用性在iOS
12中隐藏窗口场景内容。

这是可以在iOS 12和iOS 13上正常运行的解决方案的基本示意图:

AppDelegate.Swift

import UIKit
@UIApplicationMain
class AppDelegate : UIResponder, UIApplicationDelegate {
    var window : UIWindow?
    func application(_ application: UIApplication,
        didFinishLaunchingWithOptions 
        launchOptions: [UIApplication.LaunchOptionsKey : Any]?)
        -> Bool {
            if #available(iOS 13, *) {
                // do only pure app launch stuff, not interface stuff
            } else {
                self.window = UIWindow()
                let vc = ViewController()
                self.window!.rootViewController = vc
                self.window!.makeKeyAndVisible()
                self.window!.backgroundColor = .red
            }
            return true
    }
}

SceneDelegate.swift

import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window : UIWindow?
    func scene(_ scene: UIScene,
        willConnectTo session: UISceneSession,
        options connectionOptions: UIScene.ConnectionOptions) {
            if let windowScene = scene as? UIWindowScene {
                self.window = UIWindow(windowScene: windowScene) 
                let vc = ViewController()                      
                self.window!.rootViewController = vc             
                self.window!.makeKeyAndVisible()                 
                self.window!.backgroundColor = .red
            }
    }
}

ViewController.swift

import UIKit
class ViewController : UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("view did load")
        self.view.backgroundColor = .green
    }
}

请注意,处理其他重复项(例如,激活应用程序)要简单得多,因为如果您支持窗口场景,则不会在iOS
12上调用应用程序委托方法。因此,问题仅限于这种情况,即您拥有窗口/根视图控制器操纵以在启动时执行(例如,没有故事板)。



 类似资料:
  • 问题内容: 在我的SwiftUI项目中,我同时看到文件和文件。 它们之间有什么区别? 例如,在 并在 问题答案: 这两个文件旨在按整体运行应用程序所需的内容以及将支持在后台运行的一个“实例”所需的内容进行拆分。这将类似于一次配置数据库,但按窗口显示不同的值集。 您可以将它们视为全局和私有版本。一个是共享的,另一个则限于个人所有者。在某种程度上,它们正是您所期望的名称。 多窗口支持正在发生 下次创建

  • 我对Android Studio3.0金丝雀有一个问题。在所有项目中,我不能使用预览工具中的支持库中的任何视图。显示呈现错误。在新项目中也是同样的问题。 Samople代码: 格雷德尔:

  • 社区帮助 社区帮助是 adobe.com/cn 上的一个集成环境,允许您访问由 Adobe 和行业专家主持的社区生成的内容。用户的注释可帮助您找到答案。搜索 “社区帮助 ”,查找 Web 上关于 Adobe 产品和技术的最佳内容,包含以下资源: 视频、教程、提示和技巧、博客、文章及设计和开发人员的示例。 完整的联机帮助。此联机帮助会定期更新且比随产品提供的 “帮助 ”更完整。访问帮助时,如果连接到

  • 在Java web应用程序的根目录中有以下两个servlet和一个index.html页面。html页面收集一些数据,使用Insert servlet插入数据,然后向用户提供一个URL来检索数据(即http://localhost:8080/12345)。我希望用户能够将http://localhost:8080/12345放在浏览器中,并调用Retrieve servlet。 现在发生的事情是,

  • 本文向大家介绍Nginx同时支持Http和Https的配置详解,包括了Nginx同时支持Http和Https的配置详解的使用技巧和注意事项,需要的朋友参考一下 现在的网站支持Https几乎是标配功能,Nginx能很好的支持Https功能。下面列举一个配置同时支持Http和Https的功能。 需要注意的是:既然选择使用Https,就是为了保证通信安全,那么就没必要再用Http进行通信了。在URL中还

  • 我想用com。Android支持:设计:22.2.0在我的Android Studio(1.3)项目中,但当我添加'com'时。Android支持:设计:22.2.0'到依赖{}我有103个错误,我无法摆脱这个错误。 如果我尝试使用新版本的appcompat,也会发生同样的情况。现在我有了“com”。Android支持:appcompat-v7:19。“以我的身材。格雷德尔。 有人知道吗? 我的错