【发布时间】:2020-04-12 02:08:09
【问题描述】:
以下代码在 SwiftUI List 中正确显示 Realm 数据库中的所有“用户”。我的问题是滑动一行时删除记录。
当我滑动一行并点击删除按钮时,我立即收到 uncaught exception 错误,List 没有更新,但我知道正确的项目从 Realm 数据库中删除,因为我下次运行所选记录未显示的应用。
这是我的代码。
SwiftUI 代码
import RealmSwift
struct ContentView: View {
@State private var allUsers: Results<User> = realm.objects(User.self)
var body: some View {
VStack{
Text("Second Tab")
List{
ForEach(allUsers, id:\.self) { user in
HStack{
Text(user.name)
Text("\(user.age)")
}
}.onDelete(perform: deleteRow)
}
}
}
private func deleteRow(with indexSet: IndexSet){
indexSet.forEach ({ index in
try! realm.write {
realm.delete(self.allUsers[index])
}
})
}
}
领域模型
import RealmSwift
class User:Object{
@objc dynamic var name:String = ""
@objc dynamic var age:Int = 0
@objc dynamic var createdAt = NSDate()
@objc dynamic var userID = UUID().uuidString
override static func primaryKey() -> String? {
return "userID"
}
}
错误
由于未捕获的异常“RLMException”而终止应用程序,原因:“索引 4 超出范围(必须小于 4)。”
当然,4 会根据 Realm 数据库中的项目数量而变化,在这种情况下,当我滑动并点击删除按钮时,我有 5 条记录。
我的期望是每次allUsers @State 变量更改时List 都会更新,我知道我的问题不是完全理解绑定的工作原理。
我做错了什么?
【问题讨论】:
-
在哪个确切的操作上,你得到了这个异常?
-
错误指向 AppDelegate -
Thread 1: signal SIGABRT -
第一个问题是 List 或 ForEach 中传递的数据必须符合 Identifiable 协议。此外,由于 Results 对象的性质,Realm 并不是非常适合 SwiftUI - 您可能暂时希望依靠通知来处理 UI 更新。一旦 Realm 有了 Frozen Objects,实现 Realm 功能就会更容易。
-
那么,如果我理解正确的话,您的意思是,到目前为止,Realm 和 SwiftUI 不能很好地协同工作?在 Realm 端或 SwiftUI 上学习通知?感谢您指出 List 或 ForEach 中传递的数据必须符合 Identifiable 协议这一事实。
-
这是我们迄今为止的经验。这并不是 Realm 的“问题”,因为结果按预期工作 - 它是与 SwiftUI 本质的交互。 SO上有许多similar questions,但没有不是解决方法的实际答案-其中大多数都与利用通知相关。
标签: ios realm swiftui swiftui-list