Passez la méthode suivante pour effectuer avec .onDelete of List of SwiftUI,
func deleteRow(offsets: IndexSet) {
guard let index = offsets.first else {
return
}
let deleteItem = hoges[index]
try! realm.write {
realm.delete(deleteItem)
}
self.hoges = realm.objects(Hoge.self)
}
En guise de test, quand je l'ai écrit comme ça, il s'est écrasé avec l'erreur «L'index ~ est hors limites (doit être inférieur à ~)».
https://stackoverflow.com/questions/61165998/how-to-delete-data-from-swiftui-list-and-realm
~~ Si vous vous référez ici et tournez l'index avec forEach, il ne plantera pas! ~~
func deleteRow(offsets: IndexSet) {
offsets.forEach({ index in
try! realm.write {
realm.delete(self.hoges[index])
}
})
self.hoges = realm.objects(Hoge.self)
}
Post-scriptum: Je pensais que c'était corrigé ci-dessus, mais il ne s'est arrêté de planter que lorsque les dernières données ont été supprimées, et il s'est également écrasé lorsque j'ai supprimé d'autres cellules. J'ai personnalisé forEach en me référant aux informations fournies par google, et j'ai créé une méthode existante pour vérifier si les données existent, mais aucune d'elles n'a fonctionné,
En vous référant temporairement à cet article, créez un modèle qui définit la même valeur que les données Realm définies par @objc dynamic var
avec struct, remplacez-le depuis Realm par l'initialiseur de ViewModel, et directement depuis List Realm J'ai évité le crash en prenant la valeur du modèle sans y faire référence.
import RealmSwift
class Hoge: Object, Identifiable {
@objc dynamic var id: String = ""
@objc dynamic var title: String = ""
override static func primaryKey() -> String? {
return "id"
}
}
struct HogeModel {
let id: String
let title: String
}
https://llcc.hatenablog.com/entry/2020/04/26/205254
Cette méthode peut être assez gênante si l'échelle de développement est grande.
Il semble que RealmSwift ait un problème similaire, mais j'espère qu'il sera plus facile à utiliser avec SwiftUI! https://github.com/realm/realm-cocoa/issues/6635
En recherchant d'autres améliorations, j'ai découvert qu'il existe des objets gelés capables de gérer les résultats de domaine immuables. https://realm.io/blog/realm-database-a-new-architecture-and-frozen-objects/
Je n'ai pas encore trouvé comment l'utiliser en détail, mais j'ai trouvé un moyen plus simple que de recréer le modèle.
self.hoges = realm.objects(Hoge.self)?.freeze()
Je veux vraiment l'écrire comme ça, mais si je le déclare comme ça et que j'utilise realm.write tel que delete, il plantera.
Donc, provisoirement, lorsque vous définissez la propriété immuable sur Published et que vous l'écrivez avec l'initialiseur ou realm.write, vous pouvez éviter le crash en l'attribuant!
HogeViewModel.swift
var hoges: Results<Hoge>?
@Published var freezedHoges: Results<Hoge>?
let realm = try! Realm()
init() {
hoges = realm.objects(Hoge.self)
freezedHoges = hoges?.freeze()
}
func addHoge() {
let hoge = Hoge()
hoge.id = NSUUID().uuidString
hoge.title = "fuga"
try! realm.write {
realm.add(hoge)
}
freezedHoges = hoges?.freeze()
}