Кто-нибудь смог успешно интегрировать Realm
с SwiftUI
, особенно удаляя записи / строки из SwiftUI List
? Я пробовал несколько разных методов, но независимо от того, что я делаю, я получаю ту же ошибку. Прочитав некоторые связанные темы, я обнаружил, что у других людей такая же проблема.
Следующий код успешно представляет все элементы из Realm
в SwiftUI List
, я могу создать новые и они отображаются В списке, как и ожидалось, мои проблемы возникают, когда я пытаюсь удалить записи из списка, нажимая кнопку вручную или проводя влево, чтобы удалить выбранную строку, я получаю ошибку Индекс выходит за границы.
Любая идея, что может быть причиной ошибки?
Вот мой код:
Модель царства
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 записи, когда я проводил и нажал кнопку удаления.
FYI - ошибка указывает на файл AppDelegate с Thread 1: signal SIGABRT
.