无法将“Published<[StepsEntity]>.Publisher”类型的值转换为预期参数类型“Binding<String>”

nic*_*eps 0 binding swift swiftui combine

StepsEntity是核心数据实体

尝试在 TextField 中显示字符串值时收到以下错误:“无法将类型 'Published<[StepsEntity]>.Publisher' 的值转换为预期参数类型 'Binding'”

我知道这是因为我的核心数据模型中的 StepsEntity 是 @Published。@Published 在这里效果很好,因为它允许整齐地更新所有数据。如何在文本字段中显示@Published?

以下是我收到错误的部分:

List {
            VStack(alignment: .center) {
                if let recipeSteps = (vm.recipes[vm.getRecordsCount() - 1].steps?.allObjects as? [StepsEntity])?.sorted { $0.stepNumber < $1.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])
                            })
                    }
                
                }
            }
Run Code Online (Sandbox Code Playgroud)

vm.recipeSteps 指的是我的 CoreDataRelationshipViewModel,它是处理所有核心数据功能的地方。这在视图结构中声明为:

@StateObject var vm = CoreDataRelationshipViewModel()
Run Code Online (Sandbox Code Playgroud)

以下是 CoreDataRelationshipViewModel 类的片段:

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
Run Code Online (Sandbox Code Playgroud)

我尝试将已发布的变量转换为绑定,但没有成功:

TextField("", text: Binding(vm.$recipeSteps)!)
Run Code Online (Sandbox Code Playgroud)

我还尝试引用列表中 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 {
Run Code Online (Sandbox Code Playgroud)

Ben*_*ers 6

你的问题是

TextField("", text: vm.$recipeSteps)
Run Code Online (Sandbox Code Playgroud)

实际上应该是

TextField("", text: $vm.recipeSteps)
Run Code Online (Sandbox Code Playgroud)

因为您需要使用 Binding 而不是传递视图模型recipeSteps(当使用 Binding$将其传递到vm的点访问器之外时,会传递通用的Publisher)。

@Published此外,只有当视图模型中的属性符合StringProtocol(是字符串)时,这才有效。您确定recipeSteps是可以通过 编辑的字符串吗TextField