Установить выбранный / невыбранный цвет представления в UITableView в Swift - PullRequest
0 голосов
/ 06 февраля 2020

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

Я использую этот код для изменения цвета выбранного индекса.

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard let cell:TableViewCell = tableView.cellForRow(at: indexPath) as?  TableViewCell else { return }
    cell.backgroundColor = UIColor.red
}

Я не могу сбросить предыдущую ячейку.

Ответы [ 3 ]

2 голосов
/ 06 февраля 2020

Вам необходимо override setSelected(_:animated:) метод в TableViewCell и настроить backgroundColor на основе состояния selected.

class TableViewCell: UITableViewCell {
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        self.backgroundColor = selected ? .red : .clear
    }
}

Нет необходимости изменять backgroundColor в tableView(_:didSelectRowAt:) method.

1 голос
/ 06 февраля 2020

На основании ответа PGDev вам нужно свойство в контроллере представления, чтобы сохранить выбранный путь индекса

var selectedIndexPath : IndexPath?

Если строка не выбрана, свойство равно nil


В cellForRow добавьте строку для управления выбором

cell.isSelected = indexPath == selectedIndexPath

В didSelectRowAt сравните только что выбранный путь индекса с selectedIndexPath, обновите selectedIndexPath и перезагрузите строки соответствующим образом.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    var pathsToReload = [indexPath]
    if let selectedPath = selectedIndexPath {
        if indexPath == selectedPath { // deselect current row
            selectedIndexPath == nil
        } else { // deselect previous row, select current row
            pathsToReload.append(selectedPath)
            selectedIndexPath = indexPath
        }
    } else { // select current row
        selectedIndexPath == indexPath
    }
    tableView.reloadRows(at: pathsToReload, with: .automatic)
}
1 голос
/ 06 февраля 2020

Вы можете использовать deselectRow fun c tableView:

func deselectRow(at indexPath: IndexPath, 
    animated: Bool){
    guard let cell:TableViewCell = tableView.cellForRow(at: indexPath) as?  TableViewCell else { return }
cell.backgroundColor = UIColor.clear
}

Надеюсь, это поможет ...

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