我的應用程式當前使用 aNavigationLink打開這樣的視圖:
LazyVGrid(columns: gridLayout, spacing: 10) {
ForEach(Array(person.project! as! Set<Project>).sorted { $0.date! > $1.date! }, id: \.self) { (project: Project) in
NavigationLink(destination: ProjectDetailView(project: project, rootIsActive: self.$isActive)) {
Image(uiImage: UIImage(data: project.image1 ?? self.projectImage1)! )
...
但是為了改善 UI 的流程,我想使用 aSheet而不是NavigationLink顯示ProjectDetailView
所以我把它改成這樣:
LazyVGrid(columns: gridLayout, spacing: 10) {
ForEach(Array(person.project! as! Set<Project>).sorted { $0.date! > $1.date! }, id: \.self) { (project: Project) in
Image(uiImage: UIImage(data: project.image1 ?? self.projectImage1)! )
.onTapGesture(count: 1) { sheet = .imageTap(project) }
}
在imageTap頂部添加到我的作業表列舉的位置:
enum Sheet { case imageTap(Project) }
@State var sheet: Sheet? = nil
我的作業表修飾符將objectIDof傳遞project給視圖:
.sheet(using: $sheet) { sheet in
switch sheet {
case .imageTap:
ProjectDetailView(id: project.objectID, in: viewContext)
在我的ProjectDetailView中,我定義了我的@ObservedObject并初始化如下:
@Environment(\.managedObjectContext) private var viewContext
@ObservedObject var project: Project
init(id objectID: NSManagedObjectID, in context: NSManagedObjectContext) {
if let project = try? context.existingObject(with: objectID) as? Project {
self.project = project
self._image1 = State(wrappedValue: project.image1!)
self._image2 = State(wrappedValue: project.image2 ?? self.image2)
self._image3 = State(wrappedValue: project.image3 ?? self.image3)
self._image4 = State(wrappedValue: project.image4 ?? self.image4)
self._fav = State(wrappedValue: project.favorite)
} else {
self.project = Project(context: context)
try? context.save()
}
}
當我在影像上呼叫 時,我希望objectID將 傳遞到此視圖中。onTapGesture但是此時 Xcode 錯誤
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'nil is not a valid object ID'
I'm using this same method of passing objectID to edit a Person entity (my app has two core data entities: Person and Project), though it doesn't use a ForEach. It's just a .toolbar button and it works as expected. So I had it print the person.ObjectID and it looked like this:
0x8ae3a33c4ba2adf9 <x-coredata://468DD15D-71D2-4990-BD8B-01CAA9786420/Person/p5>
So I went and had it print the project.ObjectID upon tapping the image, and it prints a similar string that looks valid to me:
0x8ae3a33c49e2add9 <x-coredata://468DD15D-71D2-4990-BD8B-01CAA9786420/Project/p23>
So I'm pretty confused as to why ProjectDetailView is receiving a nil value when printing the objectID upon invoking imageTap produces a valid looking objectID
Any ideas? Thanks!!
uj5u.com熱心網友回復:
(如上面評論中所討論的)
我不確定您在線上參考的是哪個專案實體ProjectDetailView(id: project.objectID, in: viewContext)或它存在于什么范圍內,但相反,您應該使用您在執行時設定的列舉中的關聯值sheet = .imageTap(project)。
在這種情況下,前一行應該是:case let .imageTap(project):而不是case .imageTap.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425804.html
