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!