0
votes

Comment supprimer à l'intérieur d'une tableView?

J'ai ce code SWIFT pour une application iOS.

Je travaillais sur la TableView, afin de faire de la balayage à gauche, afin de supprimer une liste des emplacements enregistrés par l'utilisateur. P>

La partie avec les questions de questions est le parc crucial et je ne peux pas comprendre ce que je dois mettre ou où est l'erreur ... p>

Merci d'avance p>

import UIKit
import UserNotifications

class PlacesTableViewController: UITableViewController {
  override func viewDidLoad() {
    super.viewDidLoad()


    NotificationCenter.default.addObserver(
      self,
      selector: #selector(newLocationAdded(_:)),
      name: .newLocationSaved,
      object: nil)
  }

  @objc func newLocationAdded(_ notification: Notification) {
    tableView.reloadData()
  }

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return LocationsStorage.shared.locations.count
  }




    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete{

            ???.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)

        }

    }

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "PlaceCell", for: indexPath)
    let location = LocationsStorage.shared.locations[indexPath.row]
    cell.textLabel?.numberOfLines = 2
    cell.textLabel?.text = location.description
    cell.detailTextLabel?.text = location.dateString
    return cell
  }

  override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 110
  }
}


0 commentaires

3 Réponses :


-1
votes

Pour ce que je peux voir, vous devez supprimer de

tableView.reloadData() 


3 commentaires

I'v a fait le var avec ma tableview.reloaddata (). Mais je reçois "Mise à jour invalide: Nombre non valide de lignes dans la section 0."


jamais appel tableview.reloaddata () juste après insertion- / DELLESTRESS . Deleterows met à jour l'interface utilisateur


Eh bien, il peut être une option pour supprimer simplement l'élément dans la source de données, puis recharger les données, il aura la même sortie.



0
votes

présumer que locationsStorage.shared.locations est une matrice, vous allez bien utiliser locationsStorage.shared.locations.remove (à: indexpath.row) . Si vous faites face à des problèmes avec cela, veuillez spécifier l'erreur que vous obtenez afin que je puisse vous aider davantage xxx

sur une note latérale, assurez-vous également d'ajouter beginUpdates et endupdates lorsque vous modifiez la vision de la table en effectuant plusieurs inserts / suppresses.

EDIT: -

puisque vous obtenez "Impossible d'utiliser un élément de mutation sur immuable Valeur: "emplacements 'Setter est inaccessible", ce qui signifie clairement que vous avez un accès en lecture seule à la matrice, vous avez deux options ..

1) Allez à la classe Singleton (classe de locationsStorage) et modifiez La collection emplacements pour le rendre mutable. (Vous pouvez / peut ne pas vouloir faire cela. Mais si vous avez la nécessité de modifier la matrice du singleton via la tableView, vous n'avez pas d'autre choix)

2) Si vous ne vous sentez pas vraiment. La nécessité de modifier la matrice de la classe Singleton, vous pouvez avoir votre propre collection locale au cours de la classe où vous gérez la tableView comme var mylocationArray = locationsStorage.shared.locations et utilisez ce tableau comme votre DataSource < / p>


3 commentaires

Débutumdates et endupdates n'a aucun effet dans ce cas. Il n'est requis que pour plusieurs opérations simultanées insert / Suppring / Déplacement.


Si je mettez des locationsStorage.shared.Locations, je reçois: "Impossible d'utiliser un élément de mutation de la valeur immuable:" emplacements "est inaccessible"


Ont édité la réponse. Faites-moi savoir si vous avez du mal à faire quelque chose



0
votes

comme locationsStorage.comshared.Locations est le tableau de données de DataSource vient de remplacer ??? avec elle xxx


12 commentaires

Si je mets des locationsStorage, je reçois: "Impossible d'utiliser un élément de mutation de la valeur immuable:" emplacements 'setter est inaccessible "


Changez ensuite le modèle de données et apportez les emplacements la propriété mutable. Vous ne pouvez pas supprimer une ligne sans supprimer l'élément de la source de données. Ou existe-t-il une API pour supprimer des objets dans locationsStorage ?


Comment puis-je faire cela correctement? (Désolé mais cette erreur me rend fou: /)


Je n'ai aucune idée parce que je ne sais pas locationsStorage .


Puis-je partager le fichier avec Pastebin?


Supprimer privé (défini) devant var)


Cela fonctionne comme un charme ... Quelle erreur stupide ... merci beaucoup pour l'aide !!


Repose en paix. Il supprime les emplacements sauvegardés, mais si je ferme l'application et que je l'ouvre à nouveau, tous les emplacements qui sont supprimés avant sont toujours là ... Qu'est-ce qui ne va pas? : /


Si vous supprimez un emplacement de la source de données, vous devez supprimer également le fichier correspondant sur le disque.


Donc, je dois ajouter: "Savelocoudyonisk.remove (à: indéniables.row)"?


Non, cela ne fonctionne pas. Chaque emplacement est enregistré en tant que fichier sur disque. Vous devez identifier le fichier et supprimer avec filemanager . Mais il semble que l'emplacement struct ou classe ne contienne pas le nom de fichier qui le rend assez difficile et encombrant.


S'il vous plaît poser une nouvelle question comment supprimer un emplacement. Ajoutez la classe locationsStorage et aussi l'emplacement .