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
}
Другие вопросы по тегам