NSInvalidArgumentException: nil 不是有效的对象 ID
NSInvalidArgumentException: nil is not a valid object ID
我的应用目前使用 NavigationLink
打开这样的视图:
LazyVGrid(columns: gridLayout, spacing: 10) {
ForEach(Array(person.project! as! Set<Project>).sorted { [=10=].date! > .date! }, id: \.self) { (project: Project) in
NavigationLink(destination: ProjectDetailView(project: project, rootIsActive: self.$isActive)) {
Image(uiImage: UIImage(data: project.image1 ?? self.projectImage1)! )
...
但是为了改善 UI 的流程,我想使用 Sheet
而不是 NavigationLink
来显示 ProjectDetailView
所以我改成这样:
LazyVGrid(columns: gridLayout, spacing: 10) {
ForEach(Array(person.project! as! Set<Project>).sorted { [=11=].date! > .date! }, id: \.self) { (project: Project) in
Image(uiImage: UIImage(data: project.image1 ?? self.projectImage1)! )
.onTapGesture(count: 1) { sheet = .imageTap(project) }
}
其中 imageTap
添加到我的 sheet 枚举顶部:
enum Sheet { case imageTap(Project) }
@State var sheet: Sheet? = nil
我的 sheet 修饰符将 project
的 objectID
传递给视图:
.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()
}
}
我希望在图像上调用 onTapGesture
时将 objectID
传递到此视图中。但是此时 Xcode 错误
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'nil is not a valid object ID'
我正在使用相同的传递 objectID
的方法来编辑 Person 实体(我的应用程序有两个核心数据实体:Person 和 Project),尽管它不使用 ForEach.
它只是一个 .toolbar
按钮并且按预期工作。所以我让它打印 person.ObjectID
,它看起来像这样:
0x8ae3a33c4ba2adf9 <x-coredata://468DD15D-71D2-4990-BD8B-01CAA9786420/Person/p5>
所以我让它在点击图像时打印 project.ObjectID
,它打印了一个对我来说有效的类似字符串:
0x8ae3a33c49e2add9 <x-coredata://468DD15D-71D2-4990-BD8B-01CAA9786420/Project/p23>
所以我很困惑为什么 ProjectDetailView 在调用 imageTap
时打印 objectID
时收到 nil
值一个有效的外观 objectID
有什么想法吗?谢谢!!
(如上评论所述)
我不确定您在 ProjectDetailView(id: project.objectID, in: viewContext)
行中引用的是哪个项目实例,或者它存在于什么范围内,但是,您应该使用您设置的枚举中的关联值你 sheet = .imageTap(project)
.
在那种情况下,前一行应该是:case let .imageTap(project):
而不是 case .imageTap
。
我的应用目前使用 NavigationLink
打开这样的视图:
LazyVGrid(columns: gridLayout, spacing: 10) {
ForEach(Array(person.project! as! Set<Project>).sorted { [=10=].date! > .date! }, id: \.self) { (project: Project) in
NavigationLink(destination: ProjectDetailView(project: project, rootIsActive: self.$isActive)) {
Image(uiImage: UIImage(data: project.image1 ?? self.projectImage1)! )
...
但是为了改善 UI 的流程,我想使用 Sheet
而不是 NavigationLink
来显示 ProjectDetailView
所以我改成这样:
LazyVGrid(columns: gridLayout, spacing: 10) {
ForEach(Array(person.project! as! Set<Project>).sorted { [=11=].date! > .date! }, id: \.self) { (project: Project) in
Image(uiImage: UIImage(data: project.image1 ?? self.projectImage1)! )
.onTapGesture(count: 1) { sheet = .imageTap(project) }
}
其中 imageTap
添加到我的 sheet 枚举顶部:
enum Sheet { case imageTap(Project) }
@State var sheet: Sheet? = nil
我的 sheet 修饰符将 project
的 objectID
传递给视图:
.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()
}
}
我希望在图像上调用 onTapGesture
时将 objectID
传递到此视图中。但是此时 Xcode 错误
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'nil is not a valid object ID'
我正在使用相同的传递 objectID
的方法来编辑 Person 实体(我的应用程序有两个核心数据实体:Person 和 Project),尽管它不使用 ForEach.
它只是一个 .toolbar
按钮并且按预期工作。所以我让它打印 person.ObjectID
,它看起来像这样:
0x8ae3a33c4ba2adf9 <x-coredata://468DD15D-71D2-4990-BD8B-01CAA9786420/Person/p5>
所以我让它在点击图像时打印 project.ObjectID
,它打印了一个对我来说有效的类似字符串:
0x8ae3a33c49e2add9 <x-coredata://468DD15D-71D2-4990-BD8B-01CAA9786420/Project/p23>
所以我很困惑为什么 ProjectDetailView 在调用 imageTap
时打印 objectID
时收到 nil
值一个有效的外观 objectID
有什么想法吗?谢谢!!
(如上评论所述)
我不确定您在 ProjectDetailView(id: project.objectID, in: viewContext)
行中引用的是哪个项目实例,或者它存在于什么范围内,但是,您应该使用您设置的枚举中的关联值你 sheet = .imageTap(project)
.
在那种情况下,前一行应该是:case let .imageTap(project):
而不是 case .imageTap
。