2

我目前正在使用SwiftUICoreData

情况:我有一个User Detail View和一个Delete Button。按下时,用户的核心数据条目将被删除,应用导航返回到根导航视图,这是所有用户的列表。

问题:每次Delete Button单击应用程序都会崩溃,并显示以下内容Error Message

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[User timeCreated]:无法识别的选择器发送到实例 0x2802ffa40”

我的猜测:我猜这个问题与事实有关,我用 a@ObservedObject Property Wrapper表示User Object (看下面的代码)。这也在 Delete 上更新,这显然会导致一些问题。

import SwiftUI

struct UserView: View {
    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \User, ascending: false)], animation: .default) private var users: FetchedResults<User>
    
    var body: some View {
        NavigationView {
            List {
                ForEach(users) { user in
                    NavigationLink(destination: UserDetailView(user: user)) {
                        Text(user.name)
                    }
                }
            }
        }
    }
}

struct UserDetailView: View {
    @Environment(\.managedObjectContext) var context
    @Environment(\.presentationMode) var mode: Binding<PresentationMode>
    
    @ObservedObject var user: User
    
    var body: some View {
        Button(action: { deleteUser() }) {
            Text("Delete")
        }
    }
    
    private func deleteUser() {
        context.delete(user)
            
        do {
            try context.save()
            
            // Navigate Back to List View
            self.mode.wrappedValue.dismiss()
                
        } catch let error as NSError {
            print("Error deleting Item from Core Data: \(error), \(error.userInfo)")
        }
    }
}

问题: 如何删除用户并返回根列表视图而不会导致应用程序崩溃? 注意:显然最简单的解决方案是让用户成为普通属性,但是,我需要自动更新行为,因为还有一个更新用户视图可能会改变一些内容)

谢谢你的帮助。

4

1 回答 1

1

我不确定问题出在提供的代码中......但请尝试以下操作(未经测试 - 只是想法 - 推迟删除):

private func deleteUser() {
    mode.wrappedValue.dismiss()

    DispatchQueue.main.async {
      context.delete(user)
      do {
        try context.save()
      } catch let error as NSError {
          print("Error deleting User from Core Data: \(error), \(error.userInfo)")
      }
   }
}
于 2020-12-11T12:21:55.393 回答