【发布时间】:2022-01-22 13:18:25
【问题描述】:
我在一个 SwiftUI 应用程序中有几个 Picker,其中 Picker 项目存储在 Core Data 中。 每个 Picker 项只有一个标题:String 和一个注释:String。
App 有 List 和 DetailView 格式,在 DetailView 中带有 Picker。我用 一个 @State 变量来指示是否正在编辑。如果 isEditing 为假, 文本字段显示存储的选择。如果 isEditing 为真,则显示选取器。这 一切正常,除了将 isEditing 设置为 true 会显示带有项目 0 的选择器 从数据支持。真正的价值仍然在 Core Data 中,但它看向用户 选择已被覆盖。
我创建了一个自定义绑定来设置用户选择:
var spinner1Binding: Binding<Int> {
Binding(
get: { self.selectionIndex1 },
set: {
self.selectionIndex1 = $0
self.picker1Text = picker1ListVM.picker1Items[self.selectionIndex1].picker1Title
patientDetailVM.pubSpinner1 = picker1ListVM.picker1Items[self.selectionIndex1].picker1Title
})}
视图模型 picker1Items 是 Picker1Model 的数组
struct Picker1Model: Identifiable {
let picker1Item: Picker1Item
var id: NSManagedObjectID {
return picker1Item.objectID
}
var picker1Title: String {
return picker1Item.title ?? "No Picker 1 Title"
}
var picker1Comment: String {
return picker1Item.comment ?? "No Picker 1 Comment"
}
}//picker 1 model
这是 DetailView 中的代码。我只添加了第二个文本来说明 实际价值仍然是公布的价值:
VStack {
Text(appSpinner1Title + ":")
.modifier(LabelTextSetup())
//Remove this when problem solved
Text(isEditing ? "Current: \(patientDetailVM.pubSpinner1)" : "")
.modifier(LabelTextSetup())
}
Spacer()
if isEditing {
Picker(selection: spinner1Binding, label : Text("Picker One Choice")) {
ForEach(picker1ListVM.picker1Items.indices, id: \.self) { index in
Text(picker1ListVM.picker1Items[index].picker1Title).tag(index)
}//for
}//picker
} else {
Text(patientDetailVM.pubSpinner1)
.modifier(LabelTextSetup())
}
不编辑时是这样的:
编辑时看起来像这样。显然,我希望选择器在这种情况下显示“Urgently Ortho”。
看起来这应该很容易,但我没有成功。
任何指导将不胜感激。 Xcode 13.2.1 iOS 15
【问题讨论】:
-
这能回答你的问题吗? Choosing CoreData Entities from form picker
-
并非如此。创建选择器并将值保存到 Core Data 的代码按预期工作。唯一的问题是我无法将初始选择设置为 Core Data 中确实存在的值。请参阅我的答案以获取可行但不是特别优雅的解决方案。
-
您的代码无法按照您提供的内容进行排序,它不完整且无法连接,但您不需要自定义任何东西来将选择器连接到核心数据实体以保持其始终正确。只需用 ObservedObject 包装核心数据对象并直接使用该值即可。您可能需要将选项转换为标签中的选项。请参阅示例链接。
-
感谢您的帮助。