TableView laissant des cellules vides

Répéter les cellules vides

Lors de la suppression de lignes par le bas

Après avoir supprimé une ligne ou plusieurs lignes dans mon TableView, les cellules TableView semblent se décaler ou s'actualiser d'une manière étrange qui crée plusieurs lignes vides. Semble commencer par des lignes hors écran.

J'ai essayé d'utiliser beginUpdates, endUpdates et performBatchUpdates sans changement de comportement. J'ai également confirmé que le tableau de sources de données est mis à jour correctement, tout comme le nombre de lignes dans la vue de la table.

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return paymentsArray.count
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! UserPaymentCell

    let payment = paymentsArray[indexPath.row]
    cell.payment = payment

    cell.selectionStyle = .none

    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsets(top: 0, left: 75, bottom: 0, right: 0)
    cell.layoutMargins = UIEdgeInsets.zero

    return cell
}

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


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

    let payment = paymentsArray[indexPath.row]

    if payment.payerUID == Auth.auth().currentUser?.uid {
        return true
    } else {
        return false
    }
}

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

    let payment = paymentsArray[indexPath.row]

    switch editingStyle {
    case .delete:
        deleteBillAndRefreshTotals(bill: payment, indexPath: indexPath)
    default:
        return
    }
}

func deleteBillAndRefreshTotals(bill: Bill, indexPath: IndexPath) {
    print("DELETING CELL")
    paymentsArray.remove(at: indexPath.row)
    paymentsTableView.deleteRows(at: [indexPath], with: .automatic)
    print(paymentsTableView.numberOfRows(inSection: 0))
}

Résultats attendus - pour la ligne à supprimer et toutes les cellules au-dessus ou en dessous de la cellule supprimée pour se déplacer ensemble.

2
chenders 27 janv. 2019 à 22:20

3 réponses

Meilleure réponse
override func prepareForReuse() {
    super.prepareForReuse() // <--
    self.nameLabel.text = nil
    self.backgroundColor = .white
}

Dans mon implémentation de cellule personnalisée, la fonction ci-dessus était appelée sans appeler super.prepareForReuse en premier. Par conséquent, causant les problèmes ci-dessus.

4
matt 28 janv. 2019 à 22:04

Vous pouvez essayer ce code:

paymentsTableView.beginUpdates()
paymentsTableView.deleteRows(at: [indexPath], with: .automatic)
paymentsTableView.endUpdates()
0
Son Pham 28 janv. 2019 à 10:35
after perform delete operations call reloaddata method so after that tableview will refresh.
 func deleteBillAndRefreshTotals(bill: Bill, indexPath: IndexPath) {
    print("DELETING CELL")
    paymentsArray.remove(at: indexPath.row)
    paymentsTableView.reloaddata()
    print(paymentsTableView.numberOfRows(inSection: 0))
}
0
Muhammad Hashim 28 janv. 2019 à 06:26