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

Благодарю вас!


person user1269290    schedule 07.01.2017    source источник


Ответы (2)


Сначала сообщите своему табличному представлению, что он может выбирать только одну ячейку за раз:

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.allowsMultipleSelection = false
}

Затем давайте проанализируем ваш код, вы получаете раздел, в котором выбирается текущая ячейка, и вычисляете количество строк в этом конкретном разделе. Вы перебираете строки этого раздела и проверяете, есть ли у вас ячейка в данном indexPath (я думаю, она всегда оценивается как истина, потому что у вас всегда есть ячейка в этом indexPath, вы не ставили условие в зависимости от значения вашего цикл for). Затем вы сообщаете ячейке поставить галочку, если строка в цикле 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) и .none в 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
}
person Ocunidee    schedule 07.01.2017
comment
Окуниди, спасибо за попытку. Я даже не рядом с тобой. На данный момент я все еще не понимаю основ табличных представлений. Прямо сейчас мне просто очень любопытно, почему код, который я разместил, не делает то, что я думаю, он должен. - person user1269290; 07.01.2017
comment
Ах да, я неправильно понял, о чем вы спрашивали. Какой раз вы хотите, чтобы была выбрана только одна ячейка (отображается галочка)? Вы должны сообщить своему табличному представлению, что вы не разрешаете множественный выбор: - person Ocunidee; 07.01.2017
comment
@ user1269290 вы нашли решение? - person Ocunidee; 12.01.2017
comment
Извините, у меня не было времени следить за этой темой в последние несколько дней. Это прекрасно работает! Благодарю вас! Ваш синтаксис не Swift 3.0, но он работает. - person user1269290; 13.01.2017

Swift 4.x
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
}
person Abdul Karim    schedule 11.10.2020