Затем метод cellForRowAt
становится таким простым, как:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let data = model[indexPath.row]
let identifier = data.subtitle != nil ? kSubtitleID : kNormalID
let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)
cell.textLabel?.text = data.title
cell.detailTextLabel?.text = data.subtitle
cell.accessoryType = data.isCellSelected ? .checkmark : .none
return cell
}
Затем метод didSelectRowAt
становится таким простым, как:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if let cell = tableView.cellForRow(at: indexPath) {
let isCellSelected = !(model[indexPath.row].isCellSelected)
cell.accessoryType = isCellSelected ? .checkmark : .none
model[indexPath.row].isCellSelected = isCellSelected
}
}
Обратите внимание, что нам пришлось переключить флаги обновите ячейку и модель на основе нового значения.
Более того, вы можете заменить строку обновления типа .accessory на:
tableView.reloadRows(at: [indexPath], with: .none)
Таким образом, метод будет выглядеть следующим образом:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if let cell = tableView.cellForRow(at: indexPath) {
let isCellSelected = !(model[indexPath.row].isCellSelected)
model[indexPath.row].isCellSelected = isCellSelected
tableView.reloadRows(at: [indexPath], with: .none)
}
}
Обратите внимание, что мы обновляем model
, затем перезагружаем ячейку, которая вызовет cellForRowAt
, и этот метод заботится о правильной конфигурации на основе модели.
В более общем плане, я бы рекомендовал использовать какой-нибудь объект StateController
, чтобы сохранить состояние для каждой ячейки / строки, и позаботиться о toggling
.
. Недавно я написал целую статью о том, чтоделает именно то, что вам нужно, и демонстрирует множество лучших практик:
https://idevtv.com/how-to-display-a-list-of-items-in-ios-using-table-views/