UITableView оставляет шаблон пустых ячеек после удаления одной или нескольких строк - PullRequest
0 голосов
/ 27 января 2019

В TableView оставлены пустые ячейки

Повторяющиеся пустые ячейки

При удалении строк снизу

После удаления строки или нескольких строк в моем TableView ячейки TableView, кажется, сдвигаются или обновляются странным образом, создавая несколько пустых строк.Кажется, начать со строк, которые находятся за пределами экрана.

Я пытался использовать beginUpdates, endUpdates и executeBatchUpdates без изменений в поведении.Я также подтвердил, что массив источника данных обновляется должным образом, как и количество строк в табличном представлении.

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 голосов
/ 28 января 2019

Вы можете попробовать этот код:

paymentsTableView.beginUpdates()
paymentsTableView.deleteRows(at: [indexPath], with: .automatic)
paymentsTableView.endUpdates()
0 голосов
/ 29 января 2019
override func prepareForReuse() {
    super.prepareForReuse() // <--
    self.nameLabel.text = nil
    self.backgroundColor = .white
}

В моей пользовательской реализации ячейки вышеупомянутая функция вызывалась без , которая сначала вызывала super.prepareForReuse.Поэтому вызывает проблемы выше.

0 голосов
/ 28 января 2019
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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...