0
votes

Suppression d'une ligne ne fonctionne pas dans UribleViewController

J'ai un dictionnaire que j'ai fait appelé des endroits et j'ai fait chaque cellule dans la tableViewController montrant chaque partie du dictionnaire. Je connais la fonction pour supprimer les lignes du contrôleur, mais lorsque j'exécute l'application et que l'action de supprimer rien ne se passe.

// This is my entire TableViewController. I have another ViewController that appends the dictionary.
var places = [Dictionary<String,String>()]

var activePlace = -1

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if UserDefaults.standard.object(forKey: "places") != nil { //checks if the list is not empty

            places = UserDefaults.standard.object(forKey: "places") as! [Dictionary<String, String>]
        }


        if places.count == 1 {

            places.remove(at: 0)

            places.append(["name":"Ex. Eiffel Tower", "lat": "48.858324", "lon": "2.294764"])

        }

    }

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, canEditRowAt 
    indexPath: IndexPath) -> Bool {
        return true
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return places.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        DispatchQueue.main.async {

            self.tableView.reloadData()

        }

        cell.textLabel?.text = places[indexPath.row]["name"]

        return cell
    }

    override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {

        activePlace = indexPath.row

        return indexPath

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "newPlace" {

            activePlace = -1

        }

    }

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

        if editingStyle == .delete {

            tableView.deleteRows(at: [indexPath], with: .bottom)

            places.remove(at: indexPath.row)

            UserDefaults.standard.setValue(places, forKey: "places")

        }

    }


5 commentaires

lieux est un tableau de dictionnaire et non simplement un dictionnaire .


La fonction est-elle appelée, si vous placez un point d'arrêt dans la fonction?


Pas besoin d'appeler autobleview.reloaddata () dans Cellfinorat.


Ok je l'ai supprimé et dirigé mon programme et je ne pouvais toujours pas effectuer la suppression de l'action.


J'ai ajouté une réponse ci-dessous. Vérifiez cela.


4 Réponses :


0
votes

Il est très compliqué de supprimer parfois une cellule de vue de la table. Votre code est correct mais il vous suffit de supprimer une ligne. Au lieu d'appeler TableView.Deleterstrows, vous supprimez simplement l'élément de votre dictionnaire et rechargez la vue Tableau. Activez les lignes de table à modifier à l'aide de la fonction CaneDitrowat ....

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

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

    if editingStyle == .delete {

        places.remove(at: indexPath.row)

        UserDefaults.standard.setValue(places, forKey: "places")

        tableView.reloadData()
    }

}


3 commentaires

Cela n'a pas fonctionné pour moi et les problèmes semblent être qu'il refuse de faire cette partie de mon code. La fonction ne fonctionne pas et je ne peux donc pas faire l'action de glisser à gauche.


ATTENTEZ-VOUS AJOUTÉ - FUNC TABLEVIEW (_ TableView: UitailView, Caneditritrowat IndexPath: IndustryPath) -> BOOL {RETOUR TRUE} qui permet aux lignes de table à modifier.


Oui, je l'ai fait et cela ne me permet toujours pas de modifier la ligne et de la supprimer. J'ai mis à jour mon code ci-dessus pour afficher toute la tableViewController.



0
votes

Déplacer Deleterows (à: avec:) code> après Supprimer (à:) code> Dans dans la tableView (_: commit: Forrowat :) Code> Méthode, IE

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        places.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .bottom) //here...
        UserDefaults.standard.setValue(places, forKey: "places")
    }
}


1 commentaires

Je l'ai fait et la commutation de l'ordre ne fonctionne pas. Je ne reçois toujours pas de réponse lorsque vous coupez à gauche.



0
votes

Le problème principal est la mauvaise déclaration du tableau source de données. La paire de parenthèses doit être derrière les supports xxx

dans la méthode TableView (_: commit: Forrowat: La commande est fausse. Tout d'abord supprimer la ligne des données Array source puis supprimer la ligne.

deux à ne pas faire

  • N'utilisez pas SETVALUE: FORKEY avec UserDefault Pour enregistrer une seule valeur.
  • Ne déclarez pas le tableau source de données en dehors de la classe.
    xxx

0 commentaires

0
votes

résolu:

DispatchQueue.Main.Async créait une boucle sans fin de rechargement constante des données. En supprimant que les deux fonctions d'édition ont été autorisées à courir. J'ai pu effectuer la suppression de l'action.


0 commentaires