绑定到下标不会更新 TextField (macOS)

Binding to subscript doesn't update TextField (macOS)

我有这个 Store 结构,它是我所有数据的包装器。它有一个下标运算符,接受 UUID 和 returns 关联对象。

这样,我可以将 List 绑定到类型为 UUID 的选择变量,然后在另一个视图中我可以从 UUID 访问所选对象.

但是,我遇到了一个问题,我的 TextField 绑定到 Store 没有更新。如果我将它包装在另一个 Binding 中,或者如果我只是使用 Text.

,它确实会更新

这是一个最小的可重现示例:

struct Person: Identifiable, Hashable {
    let id = UUID()
    var name: String
}

struct Store {
    var data: [Person]
    
    subscript(id: Person.ID) -> Person {
        get {
            data.first(where: { [=10=].id == id })!
        }
        set {
            data[data.firstIndex(where: { [=10=].id == id })!] = newValue
        }
    }
}

struct ContentView: View {
    @State var store = Store(data: [
        Person(name: "Joe"),
        Person(name: "Eva"),
        Person(name: "Sam"),
        Person(name: "Mary")
    ])
    @State var selection: Person.ID?
    
    var body: some View {
        NavigationView {
            List(store.data, selection: $selection) {
                Text([=10=].name)
            }
            
            if let selection = selection {
                // Creating a new Binding which simply wraps $store[selection].name
                // fixes this issue. Or just using Text also works.
                TextField("Placeholder", text: $store[selection].name)
            }
            else {
                Text("No Selection")
            }
        }
    }
}

要重现此问题,只需单击边栏上的不同名称即可。出于某种原因,详细视图的 TextField 没有更新!

如果我们简单地将 Store 移动到 ObservableObject class 和 @Published.

也可以解决这个问题

此外,使 Store 符合 Hashable 也无助于解决此问题。

我觉得 SwiftUI 缺少一些非常基本的东西。有什么办法可以解决这个问题吗?

编辑: 我已将 Store 更改为 [Person],并使用 Store 中的相同下标运算符进行了扩展。但是,问题依旧!

试试这个:

TextField("Placeholder", text: $store[selection].name)
    .id(selection)  // <-- here