UITableView复选标记重复

时间:2017-06-29 00:25:03

标签: ios swift uitableview didselectrowatindexpath

当我点击一行时,我不断在表格视图的其他部分标记复选标记。我不确定是否需要设置我的accessoryType。我试过了mytableView.reloadData()然而这也无济于事。

 var selected = [String]()
 var userList = [Users]()

@IBOutlet weak var myTableView: UITableView!

@IBAction func createGroup(_ sender: Any) {

    for username in self.selected{

        ref?.child("Group").childByAutoId().setValue(username)

        print(username)
    }

}
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let myCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
    myCell.selectionStyle = UITableViewCellSelectionStyle.none
    myCell.nameLabel.text = userList[indexPath.row].name
    return myCell
}

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

        myTableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
       let currentUser = userList[indexPath.row]
        selected = selected.filter { $0 != currentUser.name}
    }
    else{
        myTableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
        let currentUser = userList[indexPath.row]
        selected.append(currentUser.name!)
    }
            }

2 个答案:

答案 0 :(得分:2)

你的问题不在这个方法中,而是在#34;加载"细胞。 (行的单元格)

由于表格视图使用可重复使用的单元格,因此通常会加载已在其他位置显示的单元格。

因此,在细胞加载方法中你应该"重置状态"已加载的单元格,包括附件类型以及您可能已更改的任何其他属性。

所以只需在代码中更改此内容:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let myCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
    myCell.selectionStyle = UITableViewCellSelectionStyle.none
    myCell.nameLabel.text = userList[indexPath.row].name

    // ADD THIS
    if userList[indexPath.row].isSelected {
        myCell.accessoryType = UITableViewCellAccessoryType.checkmark
    } else {
        myCell.accessoryType = UITableViewCellAccessoryType.none
    }

    return myCell
}

编辑:

"用户列表[indexPath.row] .isSelected"是您必须创建和管理的属性。 (所以你还必须在didSelectRowAt方法中修改它。

答案 1 :(得分:0)

问题是您没有正确维护所选的用户信息,这将在您滚动表格时以及单元格必须重新加载数据时使用。

由于您已创建var selected = [String](),我建议您使用相同的内容。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let myCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
    let dataFoundInselectedArr =  selected.filter { $0 == userList[indexPath.row].name}

    if(dataFoundInselectedArr.count > 0){
          myCell.accessoryType = UITableViewCellSelectionStyle.checkmark
    }else{
          myCell.accessoryType = UITableViewCellSelectionStyle.none
    }

    myCell.nameLabel.text = userList[indexPath.row].name
    return myCell
}

表选择委托方法保持不变。