Exception SwiftUI-Realm:无法从中删除密钥路径的观察者,因为它未注册为观察者

Exception SwiftUI-Realm:无法从中删除密钥路径的观察者,因为它未注册为观察者,exception,swiftui,realm,Exception,Swiftui,Realm,我在最新的Realm 10.6.0版本中遇到了一个奇怪的问题。当我试图删除跨多个NavigationView使用的对象时,遇到以下错误: 无法从中删除密钥路径“myId”的观察者,因为它未注册为观察者。 我组装了一个超级简单的演示项目来重现错误。只需运行此命令并转到第三个视图,在尝试返回之前单击按钮 import SwiftUI import RealmSwift //minimum version 10.6.0 Realm and 10.5.0 RealmDatabase from https

我在最新的Realm 10.6.0版本中遇到了一个奇怪的问题。当我试图删除跨多个NavigationView使用的对象时,遇到以下错误:

无法从中删除密钥路径“myId”的观察者,因为它未注册为观察者。

我组装了一个超级简单的演示项目来重现错误。只需运行此命令并转到第三个视图,在尝试返回之前单击按钮

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")
        }
    }
}

我的设置: 模拟器:iPhone11iOS14.4 xCode 12.4 BigSur 11.1/MacBook Pro M1


非常感谢

将在下一个领域版本中发布错误修复。向KVO订阅添加保护以防止多个观察者删除

错误报告在这里

还有可能的解决办法


这里的导航有些问题。我复制并粘贴了您的代码,并更改了打印语句以打印正在传递的对象的id。当我创建三个对象并单击最后一个对象时,当第二个视图显示时,文本是列表中第一个对象的id。删除所有,再试一次,同样的事情。是的,这是个小问题。只需删除NaviationLink中的最后一部分:',isActive:$navigationViewIsActive'。但是,这不会影响错误:(