UITableView删除一或多个行后留下空白单元格的模式

时间:2019-01-27 19:20:45

标签: ios swift uitableview tableview

TableView leaving blank cells

Repeating blank cells

When deleting rows from the bottom

在我的TableView中删除一行或多行之后,TableView单元格似乎以奇怪的方式移动或刷新,从而创建了多个空白行。似乎从屏幕外的行开始。

我尝试使用beginUpdates,endUpdates和performBatchUpdates,但行为没有改变。我还确认了数据源数组正在正确更新,表视图中的行数也在正确更新。

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

预期结果-要删除的行以及删除的单元格上方或下方的所有单元格一起移动。

3 个答案:

答案 0 :(得分:2)

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

在我的自定义单元实现中,上面的函数被调用为,而没有首先调用super.prepareForReuse。因此导致上述问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以尝试以下代码:

paymentsTableView.beginUpdates()
paymentsTableView.deleteRows(at: [indexPath], with: .automatic)
paymentsTableView.endUpdates()