无法将“Binding<String?>”类型的值转换为预期的参数类型“Binding<String>”[重复]
Posted
技术标签:
【中文标题】无法将“Binding<String?>”类型的值转换为预期的参数类型“Binding<String>”[重复]【英文标题】:Cannot convert value of type 'Binding<String?>' to expected argument type 'Binding<String>' [duplicate] 【发布时间】: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))
【参考方案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: ""))
【讨论】:
不错的解决方法,但是在许多情况下,您需要将其保留为可选以避免设置值以上是关于无法将“Binding<String?>”类型的值转换为预期的参数类型“Binding<String>”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
带有 CurrentValueSubject 绑定的 TextField 上的“Binding<String> 操作尝试每帧更新多次”
如何修复 TextField Binding <String> 以在 SwiftUI 中显示和编辑