绑定到下标不会更新 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
我有这个 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