有一个由Views组成的数组,每当currentPosition变量改变时,视图就必须改变.然而,这一点没有改变.

我有一个全局ObservableObject类,它有一个由View组成的数组,值为currentPosition.我的目标是根据currentPosition变量更改视图.

class AXGlobalValues: ObservableObject {
    @Published var tabs: [AXTabItem] = [
        .init(webView: AXWebView()),
        .init(webView: AXWebView())
    ]
    
    @Published var currentPosition: Int = 0
}

在SwiftUI视图上,我编写了global.tabs[global.currentPosition].webView,我预计WebView会根据global.currentPosition的值进行更改.然而,它并没有改变.

我想要做的是添加一个onChange(of:),但由于SwiftUI是一种声明性语言,我无法更新视图.

struct AXTabView: View {
    @EnvironmentObject private var global: AXGlobalValues

    
    var body: some View {
        Text("\(global.currentPosition)")
        
        global.tabs[global.currentPosition].webView
            .onChange(of: global.currentPosition) { newValue in
                // Not allowed in SwiftUI :(
                global.tabs[global.currentPosition].webView
            }
    }
}

有没有什么方法可以更新基于currentPosition变量的视图?

提前谢谢!

推荐答案

ObservableObject是Combine框架的一部分,旨在持久化(或同步)数据模型,它不是存储SwiftUI视图 struct 的正确位置.

此外,对于像currentPosition这样的视图数据,当我们想要对一些相关变量进行分组或具有额外的逻辑时,我们通常使用带有简单值或定制 struct 的@State var.当@State发生变化时,重新计算body.

Swift相关问答推荐

启用完成并发判断以及如何解决警告(续)

按Esc键时执行操作(工作表)

格式化单位和度量值.为什么从符号初始化的单位不能产生与静态初始化相同的结果

我可以在预览中通过拖动手势跳转,但在模拟器中失败

文件命名&NumberForMatter+扩展名&:含义?

如何在macOS中延迟退出应用程序的退出操作?

TimeZone 背后的目的

如何使 onKeyPress 与 TextField 快速配合使用?

如何在闭包中使用构造 await sync

如何在 macOS/AppKit 的窗口选项卡上接受拖动项目的放置?

Swift 包管理器 Package.resolved 文件末尾的版本是什么意思?

在主要参与者中启动分离任务和调用非隔离函数之间的区别

RxSwift 中 Single.just(...) 和 Observable.just(...) 之间有区别吗?

试图同时实现两个混合过渡

Swift:在子类中覆盖 == 导致仅在超类中调用 ==

为 UIActivityViewController Swift 设置不同的活动项

使 struct 可散列?

'#selector' 的参数不引用 '@objc' 方法、属性或初始化程序

强制打开已在同一行代码中 Select 性访问的变量是否安全?

无法将 NSAttributedString.DocumentAttributeKey 类型的值转换为 .DocumentReadingOptionKey