swiftui - 有没有办法在针对 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
}
解决方案
这可以使用如下@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 开发者论坛主题。
推荐阅读
- flutter - 无法使用 SharedPreferences 进行简单保存 - 我错过了什么?
- html - 如何在我们的网站中显示/嵌入带有特定主题标签的社交媒体结果帖子?
- ruby-on-rails - 带有 has_many through 和 join 表的简单表格
- hashmap - 访问对列表数组中的值
- reactjs - 如何在 reactjs 应用程序中进行复选框切换?不使用我的代码
- oracle - oci_bind_by_name(): ORA-01036
- facebook-graph-api - 如何解决 Facebook 图形 API 中“(#100)尝试访问节点类型(帖子)上不存在的字段(喜欢)”的错误
- java - 无法从 docker Linux 上的 javaKerberos Sql Server 连接中找到默认领域
- php - 获取多维数组中具有值的数组键
- android - com.sec.android.provider.badge.permission.READ 在需要时在 Android 中