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 @EnvironmentObject 在视图中更新