无法将类型 'Published<[StepsEntity]>.Publisher' 的值转换为预期的参数类型 'Binding<String>'
Cannot convert value of type 'Published<[StepsEntity]>.Publisher' to expected argument type 'Binding<String>'
StepsEntity是核心数据实体
尝试在 TextField 中显示字符串值时收到以下错误:“无法将类型 'Published<[StepsEntity]>.Publisher' 的值转换为预期的参数类型 'Binding'”
我知道这是因为我的核心数据模型中的 StepsEntity 是 @Published。 @Published 在这里工作得很好,因为它允许整齐地更新所有数据。如何在 TextField 中显示 @Published?
下面是我收到错误的部分:
List {
VStack(alignment: .center) {
if let recipeSteps = (vm.recipes[vm.getRecordsCount() - 1].steps?.allObjects as? [StepsEntity])?.sorted { [=13=].stepNumber < .stepNumber } {
if (textFieldCount == 1) {
//do nothing
} else if (textFieldCount > 1) {
ForEach(recipeSteps, id: \.stepNumber) { index in
HStack {
Text(String(index.stepNumber) + ".").bold()
TextField("", text: vm.$recipeSteps) //This is where the error is seen
}
}.onDelete(perform: { index in
self.vm.deleteRecipeSteps(at: index, from: vm.recipes[vm.getRecordsCount() - 1])
})
}
}
}
vm.recipeSteps指的是我的CoreDataRelationshipViewModel,这是处理所有核心数据功能的地方。这在视图结构中声明为:
@StateObject var vm = CoreDataRelationshipViewModel()
这是 CoreDataRelationshipViewModel 的一个片段 class:
class CoreDataRelationshipViewModel: ObservableObject {
let manager = CoreDataManager.instance
@Published var recipes: [RecipeEntity] = []
@Published var recipeSteps: [StepsEntity] = []
init() {
getRecipes()
}
func getRecipes() { ////more functions for retrieving, deleting, etc. in this section
我已经尝试将已发布的 var 转换为绑定但没有成功:
TextField("", text: Binding(vm.$recipeSteps)!)
我也试过引用列表中 if let 语句中声明的 recipeSteps,但这也不起作用。
我已经做了几天了,我想我已经用尽了所有的选择。在这里接受所有想法。也许我需要重建我的模型?
想法?
--编辑--
结构的上部,创建变量的地方:
struct AddItemView: View {
@StateObject var viewModel = ViewModel()
@State var frameDimensions: CGFloat = 0
@State var imageButtonText: String = "Click To Add Image"
@State var imageToUpload: Data
@StateObject var vm = CoreDataRelationshipViewModel()
@Environment(\.presentationMode) var presentationMode
@State var stepInfo: String = ""
@State var textFieldCount: Int = 1
@State var stepNumber: [Int]
@State var recordsCount = 1
@State var errorText = ""
@State var stepErrorColor = Color.white.opacity(0)
@State var nameErrorColor = Color.white.opacity(0)
var body: some View {
ZStack {
HStack {
你的问题是
TextField("", text: vm.$recipeSteps)
其实应该是
TextField("", text: $vm.recipeSteps)
因为您需要使用 Binding 而不是 recipeSteps
传递视图模型(当使用 $
将其传递到 vm
的点访问器之外时,传递一个通用的 Publisher
).
此外,这仅在视图模型中的 @Published
属性 符合 StringProtocol
(是一个字符串)时才有效。您确定 recipeSteps
是可以通过 TextField
编辑的字符串吗?
我最终重组了核心数据保存的工作方式。我现在不是逐项保存,而是循环遍历 for in 循环以在最后保存所有数据。这允许我通过一些状态变量在本地显示数据,然后将整个数组保存到我的核心数据实体。
StepsEntity是核心数据实体
尝试在 TextField 中显示字符串值时收到以下错误:“无法将类型 'Published<[StepsEntity]>.Publisher' 的值转换为预期的参数类型 'Binding'”
我知道这是因为我的核心数据模型中的 StepsEntity 是 @Published。 @Published 在这里工作得很好,因为它允许整齐地更新所有数据。如何在 TextField 中显示 @Published?
下面是我收到错误的部分:
List {
VStack(alignment: .center) {
if let recipeSteps = (vm.recipes[vm.getRecordsCount() - 1].steps?.allObjects as? [StepsEntity])?.sorted { [=13=].stepNumber < .stepNumber } {
if (textFieldCount == 1) {
//do nothing
} else if (textFieldCount > 1) {
ForEach(recipeSteps, id: \.stepNumber) { index in
HStack {
Text(String(index.stepNumber) + ".").bold()
TextField("", text: vm.$recipeSteps) //This is where the error is seen
}
}.onDelete(perform: { index in
self.vm.deleteRecipeSteps(at: index, from: vm.recipes[vm.getRecordsCount() - 1])
})
}
}
}
vm.recipeSteps指的是我的CoreDataRelationshipViewModel,这是处理所有核心数据功能的地方。这在视图结构中声明为:
@StateObject var vm = CoreDataRelationshipViewModel()
这是 CoreDataRelationshipViewModel 的一个片段 class:
class CoreDataRelationshipViewModel: ObservableObject {
let manager = CoreDataManager.instance
@Published var recipes: [RecipeEntity] = []
@Published var recipeSteps: [StepsEntity] = []
init() {
getRecipes()
}
func getRecipes() { ////more functions for retrieving, deleting, etc. in this section
我已经尝试将已发布的 var 转换为绑定但没有成功:
TextField("", text: Binding(vm.$recipeSteps)!)
我也试过引用列表中 if let 语句中声明的 recipeSteps,但这也不起作用。
我已经做了几天了,我想我已经用尽了所有的选择。在这里接受所有想法。也许我需要重建我的模型?
想法?
--编辑--
结构的上部,创建变量的地方:
struct AddItemView: View {
@StateObject var viewModel = ViewModel()
@State var frameDimensions: CGFloat = 0
@State var imageButtonText: String = "Click To Add Image"
@State var imageToUpload: Data
@StateObject var vm = CoreDataRelationshipViewModel()
@Environment(\.presentationMode) var presentationMode
@State var stepInfo: String = ""
@State var textFieldCount: Int = 1
@State var stepNumber: [Int]
@State var recordsCount = 1
@State var errorText = ""
@State var stepErrorColor = Color.white.opacity(0)
@State var nameErrorColor = Color.white.opacity(0)
var body: some View {
ZStack {
HStack {
你的问题是
TextField("", text: vm.$recipeSteps)
其实应该是
TextField("", text: $vm.recipeSteps)
因为您需要使用 Binding 而不是 recipeSteps
传递视图模型(当使用 $
将其传递到 vm
的点访问器之外时,传递一个通用的 Publisher
).
此外,这仅在视图模型中的 @Published
属性 符合 StringProtocol
(是一个字符串)时才有效。您确定 recipeSteps
是可以通过 TextField
编辑的字符串吗?
我最终重组了核心数据保存的工作方式。我现在不是逐项保存,而是循环遍历 for in 循环以在最后保存所有数据。这允许我通过一些状态变量在本地显示数据,然后将整个数组保存到我的核心数据实体。