我们只能从 iOS 13.0+ 使用 Framework SwiftUI。那么如何从部署 Target 10.0 或至少 12.0 中合并这个框架。
3 回答
尽管@DenFav是绝对正确的——使用 SwiftUI 支持 iOS 13 以下的部署目标很痛苦,但这是可能的。
脚步:
弱链接框架(我使用了这个答案):
将 -weak_framework SwiftUI 添加到其他链接器标志解决了我的问题
用 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 代码。
构建阶段 → 将二进制文件与库链接 → 添加 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 预览”。
没有合理的方法可以做到这一点。#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 支持它们