有没有办法针对iOS 13有条件地使用@StateObject?

时间:2020-08-05 23:15:18

标签: swiftui

我有一个针对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
    }

2 个答案:

答案 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

相关问题