Comment réparer un crash lors de la suppression de données de royaume dans la liste de l'interface utilisateur Swift

Crash with Index est hors limites!

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 à ~)».

~~ Comment écrire sans planter ~~

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é,

Faire un modèle

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

Utiliser des objets gelés (PostScript 20/11/16)

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()
  }
 

Recommended Posts

Comment réparer un crash lors de la suppression de données de royaume dans la liste de l'interface utilisateur Swift
Comment écraser les données Firebase avec Swift
Crash lors de la suppression des données de domaine répertoriées par swift: l'index 1 est hors limites
Comment effacer toutes les données d'une table particulière
Comment créer un URI de données (base64) en Java
Comment changer la couleur d'arrière-plan de la barre de navigation, etc. dans Swift UI
[Swift] Comment envoyer une notification
Comment afficher une liste de chaînes dans JSF sous forme de chaînes séparées par des virgules
Comment trier une liste à l'aide du comparateur
[swift5] Comment spécifier la couleur en hexadécimal
Essayez d'afficher une vue Web légèrement riche dans SwiftUI en utilisant UIViewRepresentable
[Java] Comment ajouter des données à la liste (add, addAll)
Comment fixer la date système dans JUnit
Comment donner MAX + 1 ID aux données enregistrées lors de l'ajout d'un nouvel enregistrement
[Swift5] Comment créer un écran de démarrage
Comment passer un proxy lors du lancement de REST avec SSL en Java
Comment publier une bibliothèque dans jCenter
Comment référencer une colonne lors du remplacement de la méthode de nom de colonne dans ActiveRecord
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)
Comment créer une combinaison unique de données dans la table intermédiaire des rails
Précautions lors de l'enregistrement de données avec Realm (distinction entre Managed / Unmanaged, quand utiliser copyToRealm ())
[Rails] Comment écrire lors de la création d'une sous-requête
Comment afficher une page Web en Java
Comment exécuter une tâche djUnit dans Ant
Comment ajouter un chemin de classe dans Spring Boot
Comment créer un thème dans Liferay 7 / DXP
Comment implémenter une fonctionnalité similaire dans Rails
[Swift UI] Comment désactiver ScrollsToTop de ScrollView
Comment créer facilement un pull-down avec des rails
Comment exécuter des tâches en parallèle avec Swift dans Swift Package
Comment générer automatiquement un constructeur dans Eclipse
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Swift] Comment afficher les caractères saisis sur le Widget via UserDefaults lors de l'utilisation du WidgetKit
Comment implémenter UICollectionView avec du code uniquement dans Swift
Comment créer un environnement Java en seulement 3 secondes
Comment implémenter une fonctionnalité intéressante dans Ajax avec Rails
Comment créer un projet Spring Boot dans IntelliJ
Comment lancer une autre commande dans un programme Ruby
Comment afficher un aperçu du navigateur avec VS Code
[Comment insérer une vidéo dans un hameau avec Rails]
Comment écrire une recherche de comparaison de dates dans Rails
Comment se moquer d'un appel de super méthode dans PowerMock
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
[swift5] Comment exécuter le traitement lorsque tabBar est appuyé
Comment convertir un fichier en tableau d'octets en Java
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
[Rails] Comment charger JavaScript dans une vue spécifique
Comment écrire un mod de base dans Minecraft Forge 1.15.2
Comment lancer Swagger UI et Swagger Editor dans Docker
Comment effectuer un processus spécifique lorsque le bouton de retour est enfoncé dans le fragment Android
Un mémorandum quand j'ai étudié comment convertir du type Epoch Time en Date avec Scala
Comment écrire dans la classe Model lorsque vous souhaitez enregistrer des données binaires dans DB avec PlayFramework