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")
}
}
4 Réponses :
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()
}
}
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.
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")
}
}
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.
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 dans la méthode deux à ne pas faire em> p> TableView (_: commit: Forrowat: code> La commande est fausse. Tout d'abord supprimer la ligne des données Array source puis supprimer la ligne. p>
SETVALUE: FORKEY CODE> avec UserDefault code> Pour enregistrer une seule valeur. LI>
résolu: p>
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. P>
lieux code> est un tableau code> dedictionnaire code> et non simplement un dictionnairecode>.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.