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 修饰符将 projectobjectID 传递给视图:

.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 实体(我的应用程序有两个核心数据实体:PersonProject),尽管它不使用 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