我有一个针对iOS 13及更高版本的SwiftUI应用。如果我在iOS 14上运行,我想有条件地使用@StateObject
属性包装器,因为它可以修复许多我不得不在iOS 13上解决的错误。
是否有任何方法可以通过#ifdef
或#if available(iOS 14, *)
调用或类似方式有条件地执行此操作?我很高兴能为iOS 14完全独立地实现给定视图。
我已经尝试过了,但是它当然不能编译。
struct MyView: View {
if #available(iOS 14, *) {
@StateObject var viewModel: ViewModel()
} else {
@ObservedObject var viewModel: ViewModel
}
答案 0 :(得分:0)
可以使用@available
属性来完成此操作,
class ViewModel: ObservableObject {}
@available(iOS 14, *)
struct FourteenView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
Text("iOS 14")
}
}
struct ThirteenView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Text("iOS 13")
}
}
struct ContentView: View {
var body: some View {
if #available(iOS 14, *) {
AnyView(FourteenView())
} else {
ThirteenView()
}
}
}
当然,这仅在Xcode 12中有效。我正在使用12.0 beta 3(12A8169g)。
AnyView()
中的ContentView
是因为在if #available(iOS 14, *)
中使用@ViewBuilder
似乎无法正常工作。请参见此Apple Developer Forum thread。
答案 1 :(得分:0)
或者,您可以使用这个适用于 iOS 13 的 StateObject:
https://gist.github.com/Amzd/8f0d4d94fcbb6c9548e7cf0c1493eaff