2017-01-07 1 views
1

У меня есть определенное количество ячеек в разделе. Моя цель - показать только последнюю выбранную ячейку, чтобы отобразить галочку. Другие ячейки не должны.Swift: включение галочки в ON только для последней выбранной ячейки - не работает

Я нашел функцию в this похожие, но старые. Я изменил его (и, я уверен, здесь проблема) немного из-за изменений в 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 

Спасибо!

ответ

1

Сначала скажите ваш TableView он может выбрать только одну ячейку в то время:

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.tableView.allowsMultipleSelection = false 
} 

Тогда давайте анализировать код, вы получаете участок, на котором выбирается настоящая ячейка и вычисления числа строк в этом конкретном разделе. Вы повторяете строки этого раздела и проверяете, есть ли у вас ячейка в указанном indexPath (я думаю, она всегда оценивает значение true, потому что у вас всегда есть ячейка в этой indexPath, вы не ставили условие в зависимости от значения вашего для цикла). Затем вы указываете ячейке флажок, если строка в for-loop равна строке ячейки, выбранной в данный момент пользователем. Как ваша функция написана, нет причин, по которым только последний в разделе получит галочку, но вы слишком усложнили вопрос.

Ваша ячейка рисуется следующим способом, и поэтому аксессуар должен быть первоначально.

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 
} 
+0

Ocunidee благодарит за попытку. Я даже не близка к тому, где вы находитесь. На данный момент я до сих пор не совсем понимаю, как основываются таблицы. Прямо сейчас мне просто очень интересно, почему код, который я написал, не делает то, что я думаю. – user1269290

+0

О, верно, я неправильно понял, о чем вы просили. В какой момент вы хотите выбрать только одну ячейку (отметьте галочкой)? Вы должны сообщить своему табло, что вы не разрешаете несколько вариантов: – Ocunidee

+0

См. Мои изменения выше – Ocunidee

Смежные вопросы