[SWIFT] So beheben Sie einen Absturz beim Löschen von Realm-Daten in der Liste der schnellen Benutzeroberfläche

Crash with Index ist außerhalb der Grenzen!

Ü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.

~~ Wie schreibe ich ohne Absturz ~~

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.

Mach ein Modell

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

Gefrorene Objekte verwenden (Postskriptum vom 20.11.16)

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

So beheben Sie einen Absturz beim Löschen von Realm-Daten in der Liste der schnellen Benutzeroberfläche
So überschreiben Sie Firebase-Daten mit Swift
Absturz beim Löschen von Realm-Daten, die von Swift aufgelistet werden: Index 1 ist außerhalb der Grenzen
So löschen Sie alle Daten in einer bestimmten Tabelle
So erstellen Sie einen Daten-URI (base64) in Java
So ändern Sie die Hintergrundfarbe der Navigationsleiste usw. in der Swift-Benutzeroberfläche
[Swift] So senden Sie eine Benachrichtigung
So geben Sie eine Liste von Zeichenfolgen in JSF als durch Kommas getrennte Zeichenfolgen aus
So sortieren Sie eine Liste mit Comparator
[swift5] So legen Sie die Farbe hexadezimal fest
Versuchen Sie, mit UIViewRepresentable eine leicht reichhaltige Webansicht in SwiftUI anzuzeigen
[Java] Hinzufügen von Daten zur Liste (add, addAll)
So beheben Sie das Systemdatum in JUnit
So geben Sie registrierten Daten beim Hinzufügen eines neuen Datensatzes die MAX + 1-ID
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
So übergeben Sie einen Proxy, wenn Sie REST mit SSL in Java auslösen
So veröffentlichen Sie eine Bibliothek in jCenter
So verweisen Sie auf eine Spalte, wenn Sie die Spaltennamensmethode in ActiveRecord überschreiben
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
Vorsichtsmaßnahmen beim Speichern von Daten mit Realm (Unterscheidung zwischen verwaltet / nicht verwaltet, wenn copyToRealm () verwendet werden soll)
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
So zeigen Sie eine Webseite in Java an
So führen Sie eine djUnit-Aufgabe in Ant aus
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So erstellen Sie ein Thema in Liferay 7 / DXP
So implementieren Sie eine ähnliche Funktion in Rails
[Swift UI] So deaktivieren Sie ScrollsToTop von ScrollView
So erstellen Sie einfach ein Pulldown mit Rails
So führen Sie Aufgaben parallel zu Swift in Swift Package aus
So generieren Sie automatisch einen Konstruktor in Eclipse
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
[Swift] So zeigen Sie die eingegebenen Zeichen im Widget über UserDefaults an, wenn Sie das WidgetKit verwenden
So implementieren Sie UICollectionView mit Code nur in Swift
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
So implementieren Sie eine nette Funktion in Ajax mit Rails
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
So starten Sie einen anderen Befehl in einem Ruby-Programm
So zeigen Sie eine Browser-Vorschau mit VS-Code an
[So fügen Sie ein Video mit Rails in haml ein]
So schreiben Sie eine Datumsvergleichssuche in Rails
So verspotten Sie einen Super-Methodenaufruf in PowerMock
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
[swift5] So führen Sie die Verarbeitung aus, wenn Sie auf die TabBar tippen
So konvertieren Sie eine Datei in ein Byte-Array in Java
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
So starten Sie die Swagger-Benutzeroberfläche und den Swagger-Editor in Docker
So führen Sie einen bestimmten Vorgang aus, wenn die Zurück-Taste im Android-Fragment gedrückt wird
Ein Memorandum, als ich untersuchte, wie man mit Scala vom Typ Epoch Time to Date konvertiert
So schreiben Sie in die Modellklasse, wenn Sie mit PlayFramework Binärdaten in der Datenbank speichern möchten