无法将类型 'Binding<String?>' 的值转换为预期的参数类型 'Binding<String>'

Cannot convert value of type 'Binding<String?>' to expected argument type 'Binding<String>'

我正在尝试在单独的详细信息视图中编辑项目。从列表中选择项目后,我想在文本字段中填充项目详细信息。

      List {
                    ForEach(vm.savedEntites) { entity in
                        Text(entity.name ?? "No Name")

                        HStack {
                        Button(action: {vm.deleteMemory(entity: entity)}) {
                                       Label("Delete",systemImage: "trash")
       
                                     }
                     
                            Button(action: {
                                    vm.selectedEntity = entity
                                    showingDetailScreen.toggle()}) {
                            Label("Details", systemImage: "pencil")
                                     }
                            
                        }
                    }// list ends here
                    .sheet(isPresented: $showingDetailScreen) {
                        DetailItemView(isVisible: self.$showingDetailScreen, entity: vm.selectedEntity!, text: vm.selectedEntity!)
                           }// sheet ends here
                }
            

详细项目视图sheet。这是我在 TextField

旁边收到此错误的地方

Cannot convert value of type 'Binding<String?>' to expected argument type 'Binding'

 struct DetailItemView: View  {
        
        @Environment(\.presentationMode) var presentationMode
        @Binding var isVisible: Bool
        var entity: MemoryEntity
        @ObservedObject var text: MemoryEntity
 
        var body: some View {
           Text(entity.name ?? "No Name")
           TextField(text.name ?? "No Name", text: $text.name)
         ....}

这是项目的 CoreData 模型class

class CoreDataViewModel: ObservableObject {
    let container: NSPersistentContainer
    @Published var savedEntites: [MemoryEntity] = []
    @Published var selectedEntity: MemoryEntity?
    init() {
        container = NSPersistentContainer(name: "MemoryContainer")
        container.loadPersistentStores { (description, error) in
            if let error = error {
              print("Error loading CoreData. \(error)")
        }
        }
        FetchMemories()
    }

因为所有核心数据字段都是可选的,所以你必须把它包装成Binding。由于您正在使用核心数据并且可能会面临很多选项,因此您可以创建一个扩展:

extension Binding {
     func toUnwrapped<T>(defaultValue: T) -> Binding<T> where Value == Optional<T>  {
        Binding<T>(get: { self.wrappedValue ?? defaultValue }, set: { self.wrappedValue = [=10=] })
    }
}

这样使用:

TextField("title", text: $text.name.toUnwrapped(defaultValue: ""))