想象你有一个
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
。这些 NavigationLink 具有一个按钮,它用相同的对象(通过 id)但不同的属性替换 objects
数组
@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
。
但是如果您使用模型(观察变化),视图将会改变, 如示例代码所示。
struct TheObject: Identifiable, Hashable {
var id: String
var title: String
}
class Model: ObservableObject {
@Published var objects = [TheObject(id: "id", title: "title")]
}
struct ContentView: View {
@StateObject private var model = Model()
var body: some View {
NavigationStack {
List(model.objects) { object in
Text(object.title)
NavigationLink("Text", value: object)
}
.navigationDestination(for: TheObject.self) { object in
if let obj = model.objects.first(where: {$0.id == object.id}) {
Text(obj.title)
.onTapGesture {
print("------> onTapGesture")
model.objects = [TheObject(id: "id", title: "title changed")]
}
}
}
}
}
}