Swift: переключение флажка на ON только для последней выбранной ячейки - не работает
У меня есть определенное количество клеток в разделе. Моя цель - иметь только последнюю выбранную ячейку для отображения галочки. Другие клетки не должны.
Я нашел функцию в этой аналогичной, но более старой теме. Я немного изменил его (и держу пари, что в этом проблема) из-за изменений в Swift 3.0.
Как написано ниже, для меня функция не работает должным образом. Только последняя ячейка (не последняя выбранная, но последняя в разделе) в разделе будет когда-либо отмечена галочкой. Но я не могу понять, почему нет.
Вот полная функция:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let section = indexPath.section
let numberOfRows = tableView.numberOfRows(inSection: section)
for row in 0..<numberOfRows {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = row == indexPath.row ? .checkmark : .none
}
}
}
Распечатав значения, я могу видеть, когда это утверждение ниже оценивается как истинное, и это имеет смысл. Но галочка не переключается.
cell.accessoryType = row == indexPath.row ? .checkmark : .none
Спасибо!
2 ответа
Сначала скажите вашему табличному виду, что он может выбрать только одну ячейку за раз:
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.allowsMultipleSelection = false
}
Затем, давайте проанализируем ваш код, вы получите раздел, в котором выбирается текущая ячейка, и рассчитаете количество строк в этом конкретном разделе. Вы перебираете строки этого раздела и проверяете, есть ли у вас ячейка с заданным indexPath (я думаю, она всегда имеет значение true, потому что у вас всегда есть ячейка с указанным indexPath, вы не ставили условие в зависимости от значения вашего для цикла). Затем вы сообщаете ячейке галочку, если строка в цикле for равна строке ячейки, выбранной пользователем в данный момент. Поскольку ваша функция написана, нет причины, по которой только последний в разделе получит галочку, но вы слишком усложнили вопрос.
Ваша клетка нарисована следующим способом, и аксессуар должен быть изначально.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "YourCell", for: indexPath)
cell.textLabel?.text = "your text"
cell.accessoryType = cell.isSelected ? .checkmark : .none
// cell.selectionStyle = .none if you want to avoid the cell being highlighted on selection then uncomment
return cell
}
Тогда вы можете просто сказать, что тип аксессуара должен быть.checkmark в tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
и. нет в tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
Вот как это сделать, и вы должны быть хорошими, если не дайте мне знать, и я могу редактировать снова.
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .checkmark
}
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .none
}
Свифт 4.х
Xcode 12
func viewDidLoad() {
tableView.allowsMultipleSelection = false
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tvAmbientSoundTableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tvAmbientSoundTableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}