使在 Xcode 11 中创建的项目向后兼容

Posted

技术标签:

【中文标题】使在 Xcode 11 中创建的项目向后兼容【英文标题】:Making project created in Xcode 11 backwards compatible 【发布时间】:2019-10-05 09:55:40 【问题描述】:

我使用 Xcode 11 创建了一个新项目。我习惯于以编程方式创建我的 UIWindow 的根视图控制器,我首先注意到了这个新的 SceneDelegate 文件。经过一番研究,我发现一篇文章描述了如何使用这个新的UIScene API 创建根视图控制器,它似乎工作正常。但是,我找不到对较低 ios 版本执行相同操作的方法,因为 AppDelegate 类现在不再具有 window 属性。所以我的问题是如何以编程方式为其他 iOS 版本创建根视图控制器?

【问题讨论】:

UIScene 仅适用于 iOS13+,因此如果您想支持较旧的 OS-es,则需要手动添加 UIWindow 代码。 请参阅 github.com/rmaddy/XcodeTemplates 了解更新的 Single View App 模板,该模板创建基于代码或故事板的应用项目,支持 iOS 12 和 13。它同时支持 Swift 和 Objective-C。 【参考方案1】:

如果有人遇到同样的事情,这里是代码。

iOS 13 工作流程

代码取自 this 文章。

在您的 SceneDelegate 文件中:

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let windowScene = (scene as? UIWindowScene) else  return 
        self.window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        self.window?.windowScene = windowScene

        let controller = UIViewController()
        let navigationController = UINavigationController(rootViewController: controller)

        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()
    

iOS 12 及更低版本

在您的 AppDelegate 文件中:

    var window: UIWindow?

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

        if #available(iOS 13.0, *)  return true 

        self.window = UIWindow(frame: UIScreen.main.bounds)

        let controller = UIViewController()
        let navigationController = UINavigationController(rootViewController: controller)

        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()

        return true
                             

UIWindow 保存在变量中以使其显示非常重要。

【讨论】:

这个答案只是一个开始。它不完整。 didFinishLaunchingWithOptions 在 iOS 12 和 13 下都会被调用。但是你不想在 iOS 13 下创建窗口或根视图控制器。 请参阅***.com/a/58208876/1226963 了解正确设置。

以上是关于使在 Xcode 11 中创建的项目向后兼容的主要内容,如果未能解决你的问题,请参考以下文章

如何使在 ddply 中创建的对象在函数外部可用(在全局环境中)?

用于打开商店的模型与用于创建商店的模型不兼容

Xcode Swift 调试器不会显示在 if 语句中创建的变量

Xcode 4 Core Data:如何使用在数据模型编辑器中创建的获取属性

在 VS2013 中创建与 VC++ 6.0 向后兼容的 Dll

Xcode 兼容性的 Swift 框架问题