Swift, всплывающее окно с табличным представлением показывает галочку на позициях, где она никогда не была нажата - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь показать всплывающее окно, где пользователь может выбрать несколько строк для фильтрации данных.Для этого я создал этот popupViewcontroller:

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCell.AccessoryType.checkmark{
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none

        checkedCategories.remove(at: indexPath.row)
    }else{
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark
        checkedCategories.append(allcategories[indexPath.row])
    }
}

Но проблема в том, что если пользователь нажимает на первую позицию, он показывает также галочку на последнем элементе.Эта ошибка возникает только после прокрутки.

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Не используйте отдельный массив для хранения путей индекса. Это очень плохая практика.

Клетки используются повторно. Вы должны убедиться, что каждый элемент пользовательского интерфейса установлен в определенное состояние в cellForRow.

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

var isSelected = false

В cellForRow установите флажок в соответствии со свойством

let item = datasource[indexPath.row]
cell.accessoryType = item.isSelected ? .checkmark : .none

В didSelectRowAt переключите isSelected и перезагрузите строку

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {   
     datasource[indexPath.row].isSelected.toggle()
     tableView.reloadRows(at: [indexPath], with: .none)
}
0 голосов
/ 14 апреля 2019

Это потому, что клетки сняты, поэтому внутри cellForRowAt

cell.accessoryType = checkedCategories.contains(indexPath.row) ? .checkmark : .none

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

checkedCategories.removeAll(where:{ $0 == indexPath.row })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...