アプリは、一覧画面と詳細画面で構成されています。
詳細画面の削除ボタンをクリックすると、データが削除され、一覧画面に戻ります。
しかし、次のエラーでクラッシュしてしまいます。
Thread 1: Exception: "The RLMArray has been invalidated or the object containing it has been deleted."
もう一度アプリを起動するとデータは削除されていますが、
クラッシュせずに削除するにはどうすればいいでしょうか?
Swift
1struct ListView: View { 2 @ObservedObject private var fetcher = Fetcher() 3 4 var body: some View { 5 NavigationView { 6 VStack { 7 ForEach(self.fetcher.items) { (item: Item) in 8 NavigationLink(destination: DetailView(id: item.id)) { 9 Text(item.title) 10 } 11 } 12 } 13 } 14 } 15} 16struct DetailView: View { 17 var id: String 18 @ObservedObject private var fetcher = Fetcher() 19 @Environment(.presentationMode) private var presentationMode: Binding<PresentationMode> 20 21 var body: some View { 22 VStack { 23 Button(action: { 24 self.fetcher.delete(id: self.id) 25 self.presentationMode.wrappedValue.dismiss() 26 }) { 27 Text("Delete") 28 } 29 } 30 } 31} 32 33class Fetcher: ObservableObject { 34 var realm = try! Realm() 35 var objectWillChange: ObservableObjectPublisher = .init() 36 private(set) var items: Results<Item> 37 private var notificationTokens: [NotificationToken] = [] 38 39 init() { 40 items = realm.objects(Item.self) 41 42 notificationTokens.append(items.observe { _ in 43 self.objectWillChange.send() 44 }) 45 } 46 47 func delete(id: String) { 48 guard let item = realm.objects(Item.self).filter("id == '(id)'").first else { return } 49 50 try! realm.write() { 51 realm.delete(item) 52 } 53 } 54} 55 56class Item: Object, Identifiable { 57 @objc dynamic var id = NSUUID().uuidString 58 @objc dynamic var title = "" 59 @objc dynamic var createdAt = NSDate() 60 61 override static func primaryKey() -> String? { 62 return "id" 63 } 64}
あなたの回答
tips
プレビュー