core-data - 在模态视图中编辑特定的核心数据对象
问题描述
在我学习核心数据的过程中,我现在陷入了以下困境:我在 ContentView 中显示核心数据对象的列表。如果用户想要编辑其中一个,他长按列表中的项目,弹出一个带有和编辑按钮的上下文表。到目前为止,一切都很好。编辑按钮召唤一个模态视图,编辑将在该视图上进行。
在编辑视图中,我首先通过存储在 UserDefaults 中的 UUID 属性获取正确的项目。
我能够显示该项目的名称,但我遇到了它的日期问题(该项目有一个“eventDate”日期属性。
该应用程序已构建,我在我的设备上运行它,但在我尝试编辑项目时它立即崩溃。当我将选择器要显示的值实例化为事件的日期时,我的 EditView 代码中会引发错误:
这是编辑按钮内部发生的事情:
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
}
如果有人有勇气,可以在这里找到该项目:https ://github.com/Esowes/RecentExp
谢谢你的帮助...
[编辑 :] 尝试下面建议的 .didAppear 解决方案,但似乎无法在我的身体中找到接受 .didAppear 的视图:
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
解决方案
呼叫时刻fetchedEvent
尚不可用,因此请改为在 中使用它,如下所示View.init
.didAppear
// ... 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()
}
}
推荐阅读
- xamarin.forms - MvvmCross + Xamarin.Forms:平板电脑和手机的不同页面布局
- go - 在关联表中插入时创建关联问题
- android - android:如何用动画显示视图的可见部分?
- python - 如何删除或更新每个网格的单元格
- android - 在 Recyclerview 中比较旧数据和新数据
- python - How to apply Optimizer on Variable in Chainer?
- javascript - 从输入类型文件 javascript 下载文件
- json - 空手道删除 JSON 的不同部分
- php - PHP PDO未定义索引错误使用Fileuploader类
- python - 解析文本文件并从中创建 json