微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

选择 TableView 单元格会在多个部分的行中激活复选标记

如何解决选择 TableView 单元格会在多个部分的行中激活复选标记

I've implemented checkmarks (when row is selected) with the following code in cellForRowAt:

// Add a checkmark to row when selected
    if selectedIngredients.contains(indexPath.row) {
        cell.accessoryType = .checkmark
    } else {
        cell.accessoryType = .none
    }

但是,当我选择一行时,每个部分的 index.row 会得到复选标记

enter image description here

这似乎是因为我只指定了 indexPath.row,而不是部分。我该如何编码,以便我选择的部分中的选定行获得复选标记

解决方法

使用数据存储保存这样的复选标记:

var selectedIngredients: Set<IndexPath> = [] // use set for unique save

然后 didSelect 回调:

func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath){
        if self.selectedIngredients.contains(indexPath) {
            self.selectedIngredients.remove(indexPath)
            
        } else {
            self.selectedIngredients.insert(indexPath)
        }
        
        self.tableView.reloadData()
    }

在 CellForRow 中重新加载后:

func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if selectedIngredients.contains(indexPath) {
        cell.accessoryType = .checkmark
    } else {
        cell.accessoryType = .none
    }
}

如果您希望它只有一行包含复选标记:

var selectedIngredients: IndexPath? = nil

和 didSelect 回调:

func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath){
            self.selectedIngredients = indexPath
        }

最后:

func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if selectedIngredients == indexPath {
            cell.accessoryType = .checkmark
        } else {
            cell.accessoryType = .none
        }
    }
,

你应该在 didSelect 中添加复选标记并在 didDeselect 方法中删除它们;

func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath){
    // update cell here
}

func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
    // update cell here
}

另外,看看这个答案; https://stackoverflow.com/a/34962963/13754736

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。