Дублирующиеся ячейки в UITableView - PullRequest
0 голосов
/ 06 января 2019

Я прочитал некоторые объяснения здесь о том, почему это происходит, но я не могу найти решение для моего случая, которое может быть очень простым.

У меня есть UITableViewController, который имеет 2 раздела и 20 строк в каждом разделе.

Я хочу добавить UISwitcher во второй строке, поэтому я реализовал следующее:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? SettingsCell else {
        return UITableViewCell()
    }
    switch indexPath.row {
    case 2: cell.addSwitcher()
    default: break
    }
    return cell
}

Все работает как положено, пока я не прокручиваю вверх и вниз, и через некоторое время у меня будут переключатели в каждом ряду.

Есть ли способ освободить или выполнить очистку в dequeueReusableCell или я что-то здесь упускаю?

Вот моя addSwitcher() функция

public func addSwitcher() {
    accessoryView = switcher
    switcher.addTarget(self, action: #selector(switcherDidChange(switcher:)), for: .valueChanged)
    hasSwitcher = true
}

1 Ответ

0 голосов
/ 06 января 2019

Конечно, это происходит из-за выключения ячеек, когда вы устанавливаете его для этой ячейки и прокручиваете, другие показанные ячейки под ним получают ту же ячейку из dequeueReusableCell, поэтому вам нужно присвоить nil значение accessoryView для очистить все предыдущие присвоенные ему

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

Вы также можете переопределить prepareForReuse

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...