答案 0 :(得分:2)
尽管@DenFav是绝对正确的-使用SwiftUI在iOS 13以下支持部署目标很痛苦,但是有可能。
步骤:
弱链接框架(我使用了answer):
在其他链接器标志中添加-weak_framework SwiftUI可以解决我的问题
用canImport包装所有SwiftUI调用(请参见answer):
#if canImport(SwiftUI)&& canImport(Combine)
这将允许您使用部署目标 可选: 现在的问题是:如何处理viewModels。我用自己的实现解决了这个问题。您可以在Ruuvi Station的public repo中检查解决方案。注意:代码很复杂(VIPER),这就是为什么我将简短描述主要思想。 viewModel实现位于Classes/Presentation/Binding中。 我正在使用这些viewModel,wrapping与 您仍然可以observe SwiftUI code中所做的更改。 结果是:iOS 13使用SwiftUI code作为表示层,而iOS 12及更低版本使用传统的UIKit code。 如果可以使用SwiftUI代码,则viewController负责determining。 ObservableObject
一起用于SwiftUI。
答案 1 :(得分:1)
构建阶段→使用库链接二进制文件→添加SwiftUI.framework(状态:可选)
import SwiftUI
@available(iOS 13.0, *)
struct SwiftUIView : View {
var body: some View {
Text("Hello World!")
}
}
#if DEBUG
@available(iOS 13.0, *)
struct SwiftUIView_Previews : PreviewProvider {
static var previews: some View {
SwiftUIView()
}
}
#endif
等
该目标的SwiftUI预览不起作用,但是您可以添加一个特殊的目标“ SwiftUI预览”。
答案 2 :(得分:0)
没有合理的方法可以做到这一点。 #available或@available允许您区分某些代码段或整个类,但不能区分应用程序本身。
您可以使用@available使带有12.0部署目标的SwiftUI结构或类的警告静音,但在这种情况下,您需要使用Swift UI从情节提要(.xib,无论如何)中完全复制UI。此外,完全不同的“绑定”方法也将要求您在该应用程序中重新实现现有的逻辑(与您之前使用哪种架构无关)。任何VIPER,VIP,MVC旨在向ViewController(View)发送一些数据更改通知吗?在Swift UI中,您需要使用Bindable对象。它还会导致您创建ViewModel的重复项(如果有),因为它们会有所不同。
结果?您具有UI的第二种实现,视图模型的第二种实现,演示者的另外80%的实现(或使用的功能)。仅数据库和其余管理器将被重用。如果您有很好的体系结构,这是有效的。不要忘记您需要支持UI和逻辑这两个分支。
有两种方法:重新开发几乎完整的应用程序以支持SwiftUI和UIKit,或者,如果您不希望仅支持一个iOS 13,请等到iOS 14发布,然后再用SwiftUI支持它们
>