SwiftUI:在数组中更新值后视图没有改变

Posted

技术标签:

【中文标题】SwiftUI:在数组中更新值后视图没有改变【英文标题】:SwiftUI: Views are not changing after value updated in array 【发布时间】:2020-11-20 14:29:54 【问题描述】:

入门问题:我正在尝试在数组 [Member] 中包含的变量发生更改后更新视图。按下下面代码中的按钮不会执行任何操作。在阅读了许多类似的主题后,我知道这是行不通的,但我不知道如何解决。

import SwiftUI

class Member: Identifiable, ObservableObject 
    var id = UUID()
    @Published var value:Int
    
    init(value:Int) 
        self.value = value
    


class Values:ObservableObject 
    @Published var v1:Int = 1
    @Published var v2:Int = 2
    @Published var v3:Int = 3


struct ContentView: View 
    var values = Values()
    var items: [Member]
    
    init() 
        items = [Member(value: values.v1), Member(value: values.v2), Member(value: values.v3)]
    
    
    var body: some View 
        VStack 
            HStack 
                ForEach(items) i in
                    Text("Value: \(i.value)")
                
            
            Button("Change v2 = 0") 
                values.v2 = 0
            
        
    

【问题讨论】:

我明白了,你改变了价值观,无论如何都不会加入会员。重新考虑你在这里尝试做什么,因为v2 是原始值,它只是在赋值时被复制。 @Asperi:你是对的。如何从复制原始值更改为绑定/链接? 听起来更像是表关系。一个Value 与多个Members 相关。您可能会考虑使用CoreData 这个问题看起来很相似,所以检查一下:***.com/questions/62268309/… @loremipsum:CoreData 看起来不是正确的解决方案,因为我的问题更多是关于应用程序中的数据流,而不是持久存储。 【参考方案1】:

我认为这就是你想要做的......

struct Member: Identifiable 
    var id = UUID()
    var value: Int


class Values: ObservableObject 
    
    @Published var items = [Member]()
    
    init() 
        items = [Member(value: 1), Member(value: 2), Member(value: 3)]
    
    


struct ContentView2: View 
    @ObservedObject var values = Values()
    
    var body: some View 
        VStack 
            HStack 
                ForEach(values.items)  item in
                    Text("Value: \(item.value)")
                
            
            Button("Change 2nd index = 0") 
                values.items[1].value = 0
            
        
    

【讨论】:

谢谢。这显然将我引向了正确的方向。基本了解 ObservableObject、Publish 和 ForEach 循环中的更新如何工作是关键。

以上是关于SwiftUI:在数组中更新值后视图没有改变的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 更新@State 不会改变视图

Swiftui @EnvironmentObject 在视图中更新

解决vue中对象属性改变视图不更新的问题

在 SwiftUI 中更新/编辑数组元素的最佳方法

外部模型对象的 SwiftUI 数据流和 UI 更新,其值发生变化但 id 相同

SwiftUI 滑块值不尊重范围