Core data 在模态视图中编辑特定的核心数据对象
在我的核心数据学习过程中,我现在陷入了以下困境: 我在ContentView中显示核心数据对象的列表。 如果用户想要编辑其中一个,他会长时间触摸列表中的项目,然后弹出一个带有“编辑”按钮的上下文表。到现在为止,一直都还不错。 “编辑”按钮将调用一个模式视图,在该视图上进行编辑 在编辑视图中,我首先通过存储在UserDefaults中的UUID属性获取正确的项 我可以显示项目的名称,但遇到了日期问题(项目具有“eventDate”日期属性) 应用程序生成后,我在我的设备上运行它,但当我尝试编辑某个项目时,它就会崩溃。当我实例化选择器将显示的值到事件日期时,我的EditView代码中会抛出一个错误: 下面是“编辑”按钮内部发生的情况:Core data 在模态视图中编辑特定的核心数据对象,core-data,swiftui,Core Data,Swiftui,在我的核心数据学习过程中,我现在陷入了以下困境: 我在ContentView中显示核心数据对象的列表。 如果用户想要编辑其中一个,他会长时间触摸列表中的项目,然后弹出一个带有“编辑”按钮的上下文表。到现在为止,一直都还不错。 “编辑”按钮将调用一个模式视图,在该视图上进行编辑 在编辑视图中,我首先通过存储在UserDefaults中的UUID属性获取正确的项 我可以显示项目的名称,但遇到了日期问题(项目具有“eventDate”日期属性) 应用程序生成后,我在我的设备上运行它,但当我尝试编辑某个
Button(action: {
self.modalViewCaller = 1 // To tell the sheet which view to display
UserDefaults.standard.set(item.identNumber?.uuidString, forKey: kactiveEventUUID)
self.settingsModalIsPresented = true
})
{ Text("Edit entry")
Image(systemName: "globe")
}
以及在EditView中获取事件的方式:
@Environment(\.managedObjectContext) var managedObjectContext
// We get the event to be edited through its UUID :
@FetchRequest(entity: Takeoffs.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Takeoffs.eventDate, ascending: false)],
predicate: NSPredicate(format: "identNumber == %@", UUID(uuidString: UserDefaults.standard.string(forKey: kactiveEventUUID)!)! as CVarArg)) var fetchedEvent: FetchedResults<Takeoffs>
// UserDefaults.standard.object(forKey: kactiveEventUUID) as! CVarArg)
@State var selectedDate = Date()
init() { // This sets "selectedDate" to the event's value for the date picker
_selectedDate = State(initialValue: fetchedEvent.first?.eventDate ?? Date()) // The underscore is used here
}
@Environment(\.managedObjectContext)var managedObjectContext
//我们通过UUID获取要编辑的事件:
@FetchRequest(实体:Takeoffs.entity(),
sortDescriptors:[NSSortDescriptor(键路径:\Takeoffs.eventDate,升序:false)],No No No modHFGen.dll,
谓词:NSPredicate(格式:“identNumber==%@”),UUID(uuidString:UserDefaults.standard.string(forKey:kactiveEventUUID)!!as CVarArg))var fetchedEvent:FetchedResults
//UserDefaults.standard.object(forKey:kactiveEventUID)为!CVarArg)
@状态变量selectedDate=Date()
init(){//这将日期选择器的“selectedDate”设置为事件的值
_selectedDate=State(初始值:fetchedEvent.first?.eventDate??Date())//此处使用下划线
}
如果有人有勇气,可以在这里获得该项目:
谢谢你的帮助
[编辑:]尝试下面建议的.didAspect解决方案,但似乎找不到接受的视图。didAspect出现在我的身体中:
var body: some View {
NavigationView {
Form {
HStack {
Text("Airport : ")
TextField(String(fetchedEvent.first?.airportName ?? ""), text: $airportNameTextfield)
.disabled(airportNameTextfield.count > 2) // To limit the textField to 3 chars (IATA code)
Button(action: {
self.airportNameTextfield = ""
}) {
Image(systemName: "clear")
}
} // END of Hstack
Picker("", selection: $typeSelectorIndex) {
ForEach(0 ..< types.count) { index in
Text(self.types[index]).tag(index)
}
}
.pickerStyle(SegmentedPickerStyle())
// Text("Selected type is: \(types[typeSelectorIndex])")
VStack {
Button(action: {
self.selectedDate = Date()
}) {
Text("Today")
}
DatePicker("",selection: $selectedDate, displayedComponents: .date)
.padding(30)
.labelsHidden()
}
} // END of Form
.navigationBarItems(
leading:
Button("Done") {
self.saveEdits()
self.presentationMode.wrappedValue.dismiss() // This dismisses the view
} // END of Button "Done"
)
.navigationBarTitle("Event edition")
} // END of Navigation View
} // END of some View
var主体:一些视图{
导航视图{
形式{
HStack{
文本(“机场:”)
TextField(字符串(fetchedEvent.first?.airportName??),text:$airportNameTextfield)
.disabled(airportNameTextfield.count>2)//将文本字段限制为3个字符(IATA代码)
按钮(操作:{
self.airportNameTextfield=“”
}) {
图像(系统名称:“清除”)
}
}//Hstack结束
选择器(“,选择:$typeSelectorIndex){
ForEach(0..在视图中,fetchedEvent
尚不可用。init
调用时刻,因此请在中使用它。如下图所示
// ... remove that init at all
var body: some View {
Text("Any internal view here")
.onAppear {
// assigned fetched event data, here it is available
self.selectedDate = self.fetchedEvent.first?.eventDate ?? Date()
}
}
我在我的示例项目中做了完全相同的工作。我使用了另一种方法,将数据类同时注入到内容视图和模式视图中。看一看:谢谢你的回答。似乎找不到分配此任务的正确视图。已出现。我编辑了我的问题以显示我的var主体:一些视图代码。@Esowes,更正。。它是.onAppear
,您可以将其分配到最顶端的导航视图
。完成!工作得很好。