首页 > 解决方案 > 有没有办法在针对 iOS 13 时有条件地使用 @StateObject?

问题描述

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

标签: swiftui

解决方案


这可以使用如下@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()in the是ContentView因为使用if #available(iOS 14, *)in a@ViewBuilder似乎无法正常工作。请参阅此Apple 开发者论坛主题


推荐阅读