我有一个简单的结构,它是可解码/可编码和可散列的。
public struct Field: Codable, Hashable {
let key: String
enum CodingKeys: String, CodingKey {
case key
}
}
在我的 SwiftUI 中,我正在创建一个数组,我想在其中添加、删除和绑定(bind)到结构值。但我收到错误,结构不是绑定(bind)。
let decodableJSON = """
{
"key": ""
}
"""
let settableInit: Field = try! JSONDecoder().decode(Field.self, from: decodableJSON.data(using: .utf8)!)
struct Test_view: View {
@State
var settableFields: [Field] = [settableInit]
var body: some View {
ForEach(settableFields, id: \.key) { (settableField: Field) in
TextField("Key", text: settableField.key)
}
但是我收到一个错误,settableField
不是绑定(bind)。我尝试将 settableInit
作为 @ObservableObject 添加到主 Swift View,但它仍然不起作用。
有没有办法让 View 绑定(bind)到 Struct 属性,并让 TextField
更改这些属性?这感觉像是一件微不足道的事情,但由于某种原因对我来说是不可撤销的。
感谢您的指点!
最佳答案
在Xcode13中,您可以使用新的元素绑定(bind)语法:
public struct Field: Codable, Hashable {
var key: String
enum CodingKeys: String, CodingKey {
case key
}
}
struct Demo: View {
@State var settableFields: [Field] = [Field(key: "1"), Field(key: "2")]
var body: some View {
ForEach($settableFields, id: \.key) { $settableField in
TextField("Key", text: $settableField.key)
}
}
}
在 Xcode 的早期版本中,您可以使用数组的索引:
struct Demo: View {
@State var settableFields: [Field] = [Field(key: "1"), Field(key: "2")]
var body: some View {
ForEach(settableFields.indices, id: \.self) { index in
TextField("Key", text: $settableFields[index].key)
}
}
}
关于SwiftUI TextField 绑定(bind)到简单模型(非类结构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69786037/