#ios #swift #core-data #swiftui #observedobject
#iOS #swift #core-data #swiftui #observedobject
Вопрос:
В настоящее время я работаю с SwiftUI
и. CoreData
Ситуация: у меня есть a User Detail View
с a Delete Button
. При нажатии ввод основных данных пользователя удаляется, а навигация по приложению возвращается к корневому представлению навигации, которое представляет собой список всех пользователей.
Проблема: каждый раз Delete Button
, когда нажимается, приложение выходит из строя со следующим Error Message
:
*** Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: ‘-[User TimeCreated]: нераспознанный селектор, отправленный экземпляру 0x2802ffa40’
Мое предположение: я предполагаю, что проблема как-то связана с тем фактом, что я использую a @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)")
}
}
}
Вопрос: Как я могу удалить пользователя и вернуться к просмотру корневого списка без сбоя приложения? (Примечание: очевидно, что самым простым решением было бы сделать user обычным свойством, однако мне нужно поведение автоматического обновления, поскольку существует также представление пользователя Update, которое может изменить часть содержимого)
Спасибо за вашу помощь.
Ответ №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)")
}
}
}
Комментарии:
1. Спасибо за ваш ответ, однако приложение все еще сбой. У вас есть другая идея?
2. Ну … тогда я думаю, что причина не в этом коде. Не могли бы вы предоставить доступ к проекту или подготовить небольшую воспроизводимую демонстрацию?
3. Если это поможет, я могу это сделать. Однако не может ли ошибка заключаться в том, что в момент удаления пользователя свойство ObservedObject пытается обновиться и приводит к сбою приложения bc. соответствующая запись CoreData была удалена?
4. Возможно, если у вас есть прямая привязка к его свойствам где-то еще в коде.
5. Я обновил приведенный выше вопрос полным кодом для этого. Можете ли вы обнаружить какую-либо ошибку?