Как сохранить статус checkMark для определенного UITableViewCell

У меня есть UITableView в одной UIViewControllerи я пытаюсь сохранить статус accessoryType, чтобы при перезагрузке приложения пользователь предварительно выбрал ячейки, используя NSUserDefault должен отображаться с галочкой. Но проблема, с которой я сталкиваюсь, заключается в том, что когда я проверяю, совпадают ли данные ячейки с данными по умолчанию пользователя, некоторые ячейки, которые не были выбраны, также отображаются с галочкой, но этого не следует делать.

вот мои коды:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = newCategoriesTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.backgroundColor = colorArray[indexPath.row]
    let entry: Categories
    if isFiltering() {
        entry = filteredCategories[indexPath.row]
    } else {
        entry = categoryTitles[indexPath.row]
    }

    cell.selectionStyle = .none

    cell.textLabel?.text = entry.name
    cell.detailTextLabel?.text = entry.description

    let defaults = UserDefaults.standard
    if let userCategortList = defaults.object(forKey: "userCategoryList") as? [String]{
            for category in userCategortList{
                if(cell.textLabel?.text == category){
                    cell.accessoryType = .checkmark
                    break
                }
            }
        }

    return cell
}

2 ответа

Вероятно, это проблема повторного использования ячейки, поскольку вы снимаете с нее ячейки. Вы должны убедиться, чтобы установить cell.accessoryType = .none для случаев, которые не установлены на галочку.

Попробуйте с приведенным ниже фрагментом.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = newCategoriesTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
            cell.backgroundColor = colorArray[indexPath.row]
            let entry: Categories
            if isFiltering() {
                entry = filteredCategories[indexPath.row]
            } else {
                entry = categoryTitles[indexPath.row]
            }

            cell.selectionStyle = .none

            cell.textLabel?.text = entry.name
            cell.detailTextLabel?.text = entry.description

            let defaults = UserDefaults.standard
            if let entry.name ==  (defaults.object(forKey: "userCategoryList") as? [String]){
                  cell.accessoryType = .checkmark                    
                }
            else{
                  cell.accessoryType = .none
                }

            return cell
        }

Сохранить entry.name в пользовательских настройках по умолчанию.

Другие вопросы по тегам