删除 CoreData 项,它也是 DetailView 中的 @ObservedObject,导致 Swift 中的应用程序崩溃 5
Deleting CoreData Item which is also an @ObservedObject in DetailView causing App Crash in Swift 5
我目前正在与 SwiftUI
和 CoreData
合作。
情况:我有一个User Detail View
和一个Delete Button
。按下时,用户的核心数据条目被删除,应用程序导航返回到根导航视图,这是所有用户的列表。
问题: 每次单击 Delete Button
时 应用程序崩溃 与以下 Error Message
:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[User timeCreated]: unrecognized selector sent to instance 0x2802ffa40'
我的猜测: 我想问题与事实有关,我使用 @ObservedObject Property Wrapper
作为User Object
(看下面的代码)。这也在删除时更新,这显然会导致一些问题。
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)")
}
}
}
问题: 如何删除用户和return到根列表视图而不用应用程序崩溃? (注意: 显然最简单的解决方案是让用户成为普通用户 属性,但是,我需要自动更新行为,因为还有一个可能会更改某些内容的更新用户视图)
感谢您的帮助。
我不确定问题出在提供的代码中...但请尝试以下操作(未测试 - 只是想法 - 延迟删除):
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)")
}
}
}
我目前正在与 SwiftUI
和 CoreData
合作。
情况:我有一个User Detail View
和一个Delete Button
。按下时,用户的核心数据条目被删除,应用程序导航返回到根导航视图,这是所有用户的列表。
问题: 每次单击 Delete Button
时 应用程序崩溃 与以下 Error Message
:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[User timeCreated]: unrecognized selector sent to instance 0x2802ffa40'
我的猜测: 我想问题与事实有关,我使用 @ObservedObject Property Wrapper
作为User Object
(看下面的代码)。这也在删除时更新,这显然会导致一些问题。
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)")
}
}
}
问题: 如何删除用户和return到根列表视图而不用应用程序崩溃? (注意: 显然最简单的解决方案是让用户成为普通用户 属性,但是,我需要自动更新行为,因为还有一个可能会更改某些内容的更新用户视图)
感谢您的帮助。
我不确定问题出在提供的代码中...但请尝试以下操作(未测试 - 只是想法 - 延迟删除):
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)")
}
}
}