想象一下你有struct
一个
struct TheObject: Identifiable, Hashable {
var id: String
var title: String
}
现在您将该类型的数组存储在 ViewModel 中
class Model: ObservableObject {
@Published var objects = [TheObject(id: "id", title: "title")]
}
您NavigationLink
为 的每个项目创建一个objects
。这些 NavigationLinks 具有一个按钮,该objects
按钮用相同的对象(按 id)替换数组,但属性不同
@StateObject var model = Model()
NavigationStack {
List(model.objects) { object in
NavigationLink("Text", value: object)
}
.navigationDestination(for: TheObject.self) { object in
Text(object.title)
.onTapGesture {
model.objects = [TheObject(id: "id", title: "title changed")]
}
}
}
我期望会发生什么?
我期望打开的 NavigationLink 会更新为新标题。
但我得到的是什么?
视图没有改变。相反,我必须弹出视图并重新打开它才能显示更改。
我怎样才能使我预期的行为发挥作用,以及为什么它现在表现得像那样?
当您使用
Text(object.title)
传入的object
是一个let
并且不会被视图观察到变化时,因此当您更改中的模型时它不会改变onTapGesture
。但是如果使用模型(即观察变化),视图将会改变,如示例代码所示。
编辑-1:
实现您想要的另一种方法是使用
Observable
,它是更强大的替代品ObservableObject class
。例如:
Text View 没有更新的原因是
object
被作为副本传递给闭包,它不是 的同一个实例model
。要显示变异的值,您必须将 的同一个实例传递model
给 Text View,如下所示: