【问题标题】:SwiftUI TextField Binding to a simple Model (non-class sturct)SwiftUI TextField 绑定到一个简单的模型(非类结构)
【发布时间】:2021-12-15 12:59:57
【问题描述】:

我有一个简单的结构,它是可解码/可编码和可散列的。

public struct Field: Codable, Hashable {
    let key: String
    enum CodingKeys: String, CodingKey {
        case key
    }
}

在我的 SwiftUI 中,我正在创建一个数组,我想在其中添加和删除并绑定到 Struct 值。但我收到错误,Struct 没有绑定。

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 没有绑定。我尝试将settableInit 作为@ObservableObject 添加到主Swift 视图,但它仍然不起作用。

有没有办法让 View 绑定到 Struct 属性,并让TextField 更改这些属性?这感觉像是一件微不足道的事情,但出于某种原因对我来说是不可撤销的。

感谢您的指点!

【问题讨论】:

  • 因为您正在处理 JSON,请尝试使用带有自定义 {get set} 的变量的 ObservableObject,相应地读取/写入您的 JSON,并在 set 的末尾使用 objectWillChange.send() 来刷新

标签: swift swiftui binding


【解决方案1】:

Xcode13中你可以使用新的元素绑定语法:

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)
        }
    }
}

【讨论】:

  • 谢谢阿德里安,这对我有用!图例
猜你喜欢
  • 1970-01-01
  • 2020-11-23
  • 2012-11-08
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
相关资源
最近更新 更多