将文本字段绑定到数组中的对象时出错

Posted

技术标签:

【中文标题】将文本字段绑定到数组中的对象时出错【英文标题】:Error binding textfield to object in array 【发布时间】:2020-02-28 13:49:25 【问题描述】:

我有一个 SplitItem 对象数组,我正在尝试对它们执行 for 循环并显示一个文本字段。我不断收到错误 Use of unresolved identifier '$item' for this code,

import SwiftUI

struct ContentView: View 

    @State var selectedAccount:Int = -1
    @State var splitItems:[SplitItem] = [
        SplitItem(account: 0, amount: "1.00", ledger: .Accounts),
        SplitItem(account: 0, amount: "2.00", ledger: .Accounts),
        SplitItem(account: 0, amount: "3.00", ledger: .Budgets),
        SplitItem(account: 0, amount: "4.00", ledger: .Budgets)
    ]

    var body: some View 
        VStack 
            ForEach(self.splitItems)  item in
                TextField(item.amount, text: $item.amount)
            
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    



struct SplitItem: Identifiable 
    @State var id:UUID = UUID()
    @State var account:Int
    @State var amount:String
    @State var ledger:LedgerType

enum LedgerType:Int case Accounts=0,Budgets=1

如果我将 text: $item.amount 更改为 text: item.$amount 它会编译,但生成的文本字段不允许我更改它。如果我将 for 循环更改为索引并尝试基于索引进行绑定,则同样的事情,

ForEach(self.splitItems.indices)  index in
    TextField(self.splitItems[index].amount, text: self.$splitItems[index].amount)

显示Text(item.amount) 没有问题,只有在我尝试绑定时才会出现问题。我认为这与它是一个数组有关,因为如果我尝试将不在数组中的单个拆分项绑定到文本字段,它就可以正常工作。 编辑我还尝试使用文本字段创建一个子视图并从 foreach 循环中调用它,但我得到了同样的错误。

这也是适用于 Mac 而不是 ios 的 swiftui。

【问题讨论】:

【参考方案1】:

它既不是 Mac 也不是 iOS 特定的。

首先,仅将状态用作给定视图的唯一真实来源。

在您的情况下,将您的数据和业务逻辑移动到您的模型中,由一些 ObservableObject 表示。在您的视图中使用 @ObservedObject 属性包装器。

您的(简化的)数据结构和模型可以定义为

struct Item: Identifiable 
    let id = UUID()
    var txt = ""


class Model: ObservableObject 
    @Published var items = [Item(txt: "alfa"), Item(txt: "beta")]

现在您已准备好在 View 中使用此模型。当状态值发生变化时,视图使其外观无效并重新计算主体,对于 ObservedObject 也是如此。

struct ContentView: View 
    @ObservedObject var model = Model()
    var body: some View 
        VStack 
            ForEach(model.items.indices)  idx in
                VStack 
                    Text(self.model.items[idx].txt.capitalized).bold()
                    TextField("label", text: self.$model.items[idx].txt).frame(idealWidth: 200)
                
            
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    

【讨论】:

以上是关于将文本字段绑定到数组中的对象时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSUserDefaults 中绑定 NSDictionary 中的对象?

Vue.js:通过循环遍历数组值来绑定文本字段的值

在iphone中单击按钮时如何将文本字段/标签中的值添加到数组中

使用 Blazor 将输入文本动态绑定到类/对象属性

SwiftUI - 如何修改数组中的文本字段

将 JSON 子对象属性绑定到 Jackson 中的 Java 对象字段