SwiftUI - Realm: Cannot remove an observer for the key path from because it is not registered as an observer

Viewed 438

I'm facing a weird issue with the latest Realm Release 10.6.0. When I'm trying to delete an object that is used across multiple NavigationViews I run into the error:

Cannot remove an observer <RealmSwift.SwiftUIKVO 0x6000000c00e0> for the key path \"myId\" from <RLM:Unmanaged MyModel 0x6000037fa8a0> because it is not registered as an observer.

I assembled a super easy Demo Project to reproduce the error. Just run this and go to the third View where you wanna click on the button before you try to navigate back.

import SwiftUI
import RealmSwift //minimum version 10.6.0 Realm and 10.5.0 RealmDatabase from https://github.com/realm/realm-cocoa

//MARK: - Realm Model

@objcMembers class MyModel: Object, ObjectKeyIdentifiable {
    dynamic var myId = ""
    dynamic var text = ""
    dynamic var desc = ""
    
    override static func primaryKey() -> String? {
        return "myId"
    }
    
}

//MARK: - Root View

struct ContentView: View {
    
    @ObservedResults(MyModel.self) var myModel
    
    @State var navigationViewIsActive: Bool = false
    
    var body: some View {
        
        NavigationView {
            VStack {
                
                Text("Click the plus in the toolbar to add some test entries")
                
                List {
                    ForEach(myModel) { model in
                        
                        NavigationLink(destination: SecondView(navigationViewIsActive: $navigationViewIsActive, selectedEntry: model), isActive: $navigationViewIsActive)
                        {
                            Text(model.text)
                        }
                        
                    }
                }
            }
            .toolbar {
                
                ToolbarItem(placement: .navigationBarLeading){
                    Button(action: {
                        
                        let model = MyModel()
                        model.myId = UUID().uuidString.lowercased()
                        model.text = UUID().uuidString.lowercased()
                        
                        do {
                            let realm = try Realm()
                            try realm.write {
                                realm.add(model, update: .modified)
                                print("adding new entry to models")
                            }
                        } catch let error {
                            print(error.localizedDescription)
                        }
                        
                        
                    }, label: {
                        Image(systemName: "plus")
                    })
                }
                
            }
            
        }
    }
}


//MARK: - SecondView

struct SecondView: View {
    
    @Binding var navigationViewIsActive: Bool
    
    @ObservedRealmObject var selectedEntry: MyModel
    
    @State var showThirdView = false
    
    var body: some View {
        
        VStack {
            Text("Selected Entry:")
            Text(selectedEntry.text)
            Button(action: {
                print("show third view")
                self.showThirdView = true
            }, label: {
                Text("Click to show Third View")
            })
        }
        
        NavigationLink(destination: ThirdView(navigationViewIsActive: $navigationViewIsActive, selectedEntry: selectedEntry), isActive: $showThirdView, label: {EmptyView()})
        
    }
}

//MARK: - Third View

struct ThirdView: View {
    
    @Binding var navigationViewIsActive: Bool
    
    @ObservedRealmObject var selectedEntry: MyModel
    
    var body: some View {
        VStack {
        Text("Selected Entry:")
        Text(selectedEntry.text)
        Button(action: {
            print("delete this entry")
            self.navigationViewIsActive = false
            
            
            do {
                let realm = try Realm()
                try realm.write {

                    let myEntryIwantToDelete = realm.objects(MyModel.self).filter("myId=%@", selectedEntry.myId)

                    realm.delete(myEntryIwantToDelete)
                }
                print("deleting entry via realm")
            } catch {
                print("Error")
            }
            
            
            
        }, label: {
            Text("Delete this entry and go back to root view")
        })
          Text("after i click this button and navigate back i get the error")
        }
    }
}

My Setup: Simulator: iPhone 11 iOS 14.4 xCode 12.4 BigSur 11.1 / MacBook Pro M1

Thanks a lot!

1 Answers
Related