【问题标题】:SwiftUI: Views are not changing after value updated in arraySwiftUI:在数组中更新值后视图没有改变
【发布时间】: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
  • 这个问题看起来很相似,所以检查一下:stackoverflow.com/questions/62268309/…
  • @loremipsum:CoreData 看起来不是正确的解决方案,因为我的问题更多是关于应用程序中的数据流,而不是持久存储。

标签: swift swiftui


【解决方案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 循环中的更新如何工作是关键。
猜你喜欢
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
相关资源
最近更新 更多