将文本字段绑定到数组中的对象时出错
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 中的对象?