无法将类型 '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: ""))
我正在尝试在单独的详细信息视图中编辑项目。从列表中选择项目后,我想在文本字段中填充项目详细信息。
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: ""))