Как удалить данные из списка и области SwiftUI - PullRequest
1 голос
/ 12 апреля 2020

Следующий код правильно отображает все «Пользователи» из базы данных Realm в SwiftUI List. Моя проблема заключается в удалении записей при смахивании строки.

Когда я смахиваю строку и нажимаю кнопку удаления, я сразу получаю ошибку uncaught exception, List не обновляется, но я знаю нужный элемент удаляется из базы данных Realm, поскольку при следующем запуске приложения выбранная запись не отображается.

Вот мой код.

SwiftUI Code

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 записей, когда я проводил и нажимал кнопку удаления.

Я ожидал, что List будет обновляться каждый раз при изменении переменной allUsers @State, я знаю, что моя проблема не в полной мере понимает, как работает привязка.

Что я делаю неправильно?

1 Ответ

2 голосов
/ 12 апреля 2020

Я ожидал, что список будет обновляться каждый раз при изменении переменной allUsers @State

Это верно, но состояние не изменилось ... Следующее должно работать

private func deleteRow(with indexSet: IndexSet){
    indexSet.forEach ({ index in
        try! realm.write {
            realm.delete(self.allUsers[index])
        }
    })
    self.allUsers = realm.objects(User.self)     // << refetch !!
}

Примечание: ниже просто присваивается начальное значение состояния

@State private var allUsers: Results<User> = realm.objects(User.self)
...