使在 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:如何使用在数据模型编辑器中创建的获取属性