Exception SwiftUI-Realm:无法从中删除密钥路径的观察者,因为它未注册为观察者
我在最新的Realm 10.6.0版本中遇到了一个奇怪的问题。当我试图删除跨多个NavigationView使用的对象时,遇到以下错误: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
无法从中删除密钥路径“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'。但是,这不会影响错误:(