【问题标题】:Cannot convert value of type 'Binding<String?>' to expected argument type 'Binding<String>' [duplicate]无法将“Binding<String?>”类型的值转换为预期的参数类型“Binding<String>”[重复]
【发布时间】:2021-07-27 11:17:20
【问题描述】:

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

      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
                }
            

详细项目视图表。这是我在 TextField 旁边收到此错误的地方

无法将 '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 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()
    }

【问题讨论】:

  • 似乎 $text.name 是可选的
  • 使用这个:TextField(text.name ?? "No Name", text: Binding(get: {text.name ?? ""}, set: {text.name = $0}))

标签: swift core-data swiftui


【解决方案1】:

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

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

像这样使用它:

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

【讨论】:

  • 不错的解决方法,但是在许多情况下,您需要将其保留为可选以避免设置值
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2023-01-18
相关资源
最近更新 更多