7

我们只能从 iOS 13.0+ 使用 Framework SwiftUI。那么如何从部署 Target 10.0 或至少 12.0 中合并这个框架。

在此处输入图像描述

4

3 回答 3

11

尽管@DenFav是绝对正确的——使用 SwiftUI 支持 iOS 13 以下的部署目标很痛苦,但这是可能的。

脚步:

  1. 弱链接框架(我使用了这个答案):

    将 -weak_framework SwiftUI 添加到其他链接器标志解决了我的问题

  2. 用 canImport 包装所有 SwiftUI 调用(见答案):

    #if canImport(SwiftUI) && canImport(组合)

这将允许您使用部署目标 < iOS 13 进行构建和存档。

可选的:

现在的问题是:如何处理视图模型。我用自己的实现解决了这个问题。您可以在Ruuvi Station的公共 repo中查看解决方案。注意:代码很复杂(VIPER),这就是为什么我将简要描述主要思想。

viewModel 实现位于Classes/Presentation/Binding中。

我正在使用这些视图模型,并为 SwiftUI包装它们ObservableObject

您仍然可以观察SwiftUI 代码中所做的更改。

结果是:iOS 13 使用SwiftUI 代码作为表示层,而 iOS 12 及更低版本使用传统的UIKit 代码

viewController 负责确定是否可以使用 SwiftUI 代码。

于 2019-10-14T08:12:40.873 回答
2

构建阶段 → 将二进制文件与库链接 → 添加 SwiftUI.framework(状态:可选)

import SwiftUI

@available(iOS 13.0, *)
struct SwiftUIView : View {
    var body: some View {
        Text("Hello World!")
    }
}

@available(iOS 13.0, *)
struct SwiftUIView_Previews : PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }
}

等等

此目标的 SwiftUI 预览不起作用,但您可以添加一个特殊目标“SwiftUI 预览”。

于 2019-06-10T10:55:11.667 回答
0

没有合理的方法可以做到这一点。#available 或 @available 允许您区分某些代码或整个类,但不能区分应用程序本身。

您可以使用 @available 来消除 SwiftUI 结构或具有 12.0 部署目标的类的警告,但在这种情况下,您需要使用 Swift UI 从故事板(.xib 等)完全复制 UI。此外,完全不同的“绑定”方法还需要您在该应用程序中重新实现现有逻辑(与您以前使用过哪种架构无关)。任何 VIPER、VIP、MVC 都旨在向 ViewController(View) 发送一些数据更改通知?在 Swift UI 中,您需要使用 Bindable 对象。它还会导致您创建 ViewModel 的副本(如果有的话),因为它们会有所不同。

结果?你有 UI 的第二个实现,视图模型的第二个实现,另外 80% 的演示者实现(或者你用什么)。只有数据库和休息管理器将被重用。如果你有非常好的架构,这是有效的。不要忘记你需要支持 UI 和逻辑的两个分支。

有两种方法:重新开发几乎完整的应用程序以支持 SwiftUI 和 UIKit,或者,如果您不想只支持一个 iOS 13,请等到 iOS 14 发布,然后使用 SwiftUI 支持它们

于 2019-06-06T23:03:35.253 回答