【发布时间】:2020-04-16 12:22:12
【问题描述】:
有没有人能够成功地将Realm 与SwiftUI 集成在一起,尤其是从SwiftUI List 中删除记录/行?我尝试了几种不同的方法,但无论我做什么,我都会得到同样的错误。在阅读了一些相关主题后,我发现其他人也有同样的问题。
以下代码成功地在 SwiftUI List 中显示来自 Realm 的所有项目,我可以创建新项目,它们按预期显示在列表中,我的问题是当我尝试从列表中删除记录时手动按下按钮或向左滑动删除所选行,我得到一个 Index is out of bounds 错误。
知道是什么导致了错误吗?
这是我的代码:
领域模型
class Dog: Object {
@objc dynamic var name = ""
@objc dynamic var age = 0
@objc dynamic var createdAt = NSDate()
@objc dynamic var userID = UUID().uuidString
override static func primaryKey() -> String? {
return "userID"
}
}
SwiftUI 代码
class BindableResults<Element>: ObservableObject where Element: RealmSwift.RealmCollectionValue {
var results: Results<Element>
private var token: NotificationToken!
init(results: Results<Element>) {
self.results = results
lateInit()
}
func lateInit() {
token = results.observe { [weak self] _ in
self?.objectWillChange.send()
}
}
deinit {
token.invalidate()
}
}
struct DogRow: View {
var dog = Dog()
var body: some View {
HStack {
Text(dog.name)
Text("\(dog.age)")
}
}
}
struct ContentView : View {
@ObservedObject var dogs = BindableResults(results: try! Realm().objects(Dog.self))
var body: some View {
VStack{
List{
ForEach(dogs.results, id: \.name) { dog in
DogRow(dog: dog)
}.onDelete(perform: deleteRow )
}
Button(action: {
try! realm.write {
realm.delete(self.dogs.results[0])
}
}){
Text("Delete User")
}
}
}
private func deleteRow(with indexSet: IndexSet){
indexSet.forEach ({ index in
try! realm.write {
realm.delete(self.dogs.results[index])
}
})
}
}
错误
由于未捕获的异常“RLMException”而终止应用程序,原因:“索引 23 超出范围(必须小于 23)。”
当然,这 23 条记录的变化取决于 Realm 数据库中有多少项目,在这种情况下,当我滑动并点击删除按钮时,我有 24 条记录。
仅供参考 - 错误指向带有 Thread 1: signal SIGABRT 的 AppDelegate 文件。
【问题讨论】:
标签: ios swift realm swiftui swiftui-list