SwiftUI TextField 绑定(bind)到简单模型(非类结构)

标签 swift swiftui binding

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

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/

相关文章:

swift - 使用 swift 3x 以编程方式隐藏占位符

arrays - 从二维数组获取列 - 如何限制扩展中的数组类型?

swift - 使用@ViewBuilder 创建支持多个 child 的 View

swift - SwiftUI 中的 Firebase 身份验证

ios - SwiftUI - 如何将一个 TextView 与另一个 TextView 垂直对齐以制作类似于具有适当对齐方式的表格的内容?

swift - tvOS 中意外的运动效果振荡

ios - UITableView中如何根据一定条件返回固定行高或动态行高?

c# - WPF 解析绑定(bind)表达式

ruby - Ruby 中的 block 绑定(bind)

wpf - 如何为用户控件创建 MVVM 而不将所有内部结构暴露给消费者?