如果源数组更新,视图不会更新

问题描述 投票:0回答:1

想象你有一个

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 能够更新为新标题。
我得到了什么?
观点没有改变。相反,我必须弹出视图并重新打开它以显示更改。

我怎样才能让我的预期行为发挥作用?为什么它目前的行为是这样的?

swiftui swiftui-navigationlink swiftui-navigationstack
1个回答
0
投票

当您使用

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")]
                        }
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.