Übergeben Sie die folgende Methode, um sie mit .onDelete of List of SwiftUI auszuführen:
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)
}
Als Test, als ich es so schrieb, stürzte es mit dem Fehler "Index ~ ist außerhalb der Grenzen (muss kleiner als ~ sein)" ab.
https://stackoverflow.com/questions/61165998/how-to-delete-data-from-swiftui-list-and-realm
~~ Wenn Sie hier verweisen und den Index mit forEach drehen, stürzt er nicht ab! ~~
func deleteRow(offsets: IndexSet) {
offsets.forEach({ index in
try! realm.write {
realm.delete(self.hoges[index])
}
})
self.hoges = realm.objects(Hoge.self)
}
Nachtrag: Ich dachte, es wurde oben behoben, aber es hörte erst auf zu stürzen, als die letzten Daten gelöscht wurden, und es stürzte auch ab, als ich andere Zellen löschte. Ich habe für jeden angepasst, indem ich auf die Informationen verwiesen habe, die von Google ausgegeben wurden, und ich habe eine vorhandene Methode erstellt, um zu überprüfen, ob die Daten vorhanden sind, aber keine davon hat funktioniert.
Erstellen Sie vorübergehend unter Bezugnahme auf diesen Artikel ein Modell, das denselben Wert wie die von @objc dynamic var
definierten Realm-Daten mit struct definiert, und ersetzen Sie es aus Realm durch den Initialisierer von ViewModel und direkt aus List Realm Ich habe den Absturz vermieden, indem ich den Wert aus dem Modell übernommen habe, ohne darauf Bezug zu nehmen.
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
Diese Methode kann sehr problematisch sein, wenn der Entwicklungsumfang groß ist.
RealmSwift scheint ein ähnliches Problem zu haben, aber ich hoffe, dass es mit SwiftUI einfacher zu verwenden ist! https://github.com/realm/realm-cocoa/issues/6635
Bei der Suche nach weiteren Verbesserungen habe ich festgestellt, dass es eingefrorene Objekte gibt, die unveränderliche Realm-Ergebnisse verarbeiten können. https://realm.io/blog/realm-database-a-new-architecture-and-frozen-objects/
Ich habe noch nicht im Detail herausgefunden, wie ich es verwenden soll, aber ich habe einen einfacheren Weg gefunden, als das Modell neu zu erstellen.
self.hoges = realm.objects(Hoge.self)?.freeze()
Ich möchte es wirklich so schreiben, aber wenn ich es so deklariere und scope.write wie delete verwende, stürzt es ab.
Wenn Sie also die unveränderliche Eigenschaft auf Veröffentlicht setzen und sie mit dem Initialisierer oder Realm.write schreiben, können Sie den Absturz vermeiden, indem Sie sie zuweisen!
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()
}
Recommended Posts