【发布时间】:2021-09-25 22:45:57
【问题描述】:
我正在开发一个跟踪人们用药情况的 iOS 应用程序,我有一个添加视图和一个编辑视图,除了在我的编辑视图上我使用 .onAppear 加载所有药物数据之外,两者看起来几乎相同使用let medication: Medication
我的表单看起来像这样:
Form {
Group {
TextField("Medication name", text: $name).disableAutocorrection(true)
TextField("Remaining quantity", text: $remainingQuantity).keyboardType(.numberPad)
TextField("Box quantity", text: $boxQuantity).keyboardType(.numberPad)
DatePicker("Date", selection: $date, in: Date()...).datePickerStyle(GraphicalDatePickerStyle())
Picker(selection: $repeatPeriod, label: Text("Repeating")) {
ForEach(RepeatPeriod.periods, id: \.self) { periods in
Text(periods).tag(periods)
}
.onAppear {
if pickerView {
self.name = self.medication.name != nil ? "\(self.medication.name!)" : ""
self.remainingQuantity = (self.medication.remainingQuantity != 0) ? "\(self.medication.remainingQuantity)" : ""
self.boxQuantity = (self.medication.boxQuantity != 0) ? "\(self.medication.boxQuantity)" : ""
self.date = self.medication.date ?? Date()
self.repeatPeriod = self.medication.repeatPeriod ?? "Nunca"
self.notes = self.medication.notes != nil ? "\(self.medication.notes!)" : ""
}
}
}
我曾想过使用像 isEditMode 这样的绑定变量,它工作正常,但在调用不提供对象的添加视图时遇到了一些与 moc 对象相关的问题。
这是我的 editView 预览的样子
struct EditMedicationSwiftUIView_Previews: PreviewProvider {
static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
static var previews: some View {
let medication = Medication(context: moc)
return NavigationView {
EditMedicationSwiftUIView(medication: medication)
}
}
}
有什么建议吗?
【问题讨论】:
-
欢迎来到 SO - 请使用 tour 并阅读 How to Ask 以改进、编辑和格式化您的问题。如果没有Minimal Reproducible Example,就无法帮助您进行故障排除。
-
表单体验,添加编辑功能比仅渲染不可变数据复杂约 5 倍。因此,我建议使用有可能干净地解决此类问题的适当模式:MVVM、MVI 等 - 包括将所有逻辑移动到“ViewModel”,并且所有“服务”都将通过抽象访问层,即“模型”或“商店”。因此,您的视图中没有“FetchRequest” - 只是被渲染的简单的不可变数据。
标签: swift core-data swiftui swiftui-navigationlink