使用ScrollView的UITableView取消选择Problems

时间:2017-10-17 07:08:59

标签: ios uitableview uiscrollview swift4

当我滚动时,

UITableView checkmark正在取消选择

  

代码

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return dizi.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    cell.textLabel?.text=dizi[indexPath.row]

    return cell
}

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

first

second

我该如何解决?请帮帮我。

2 个答案:

答案 0 :(得分:0)

因为您还需要在UITableViewCellAccessoryType中设置cellForRowAt。因为如果使用向上/向下滚动表,那么单元格将被重用。

怎么做?获取一个数组相同大小的行,并使用值0重复,当您检查任何行,然后使用indexPath.row更新值1,如果取消选中任何行,则使用indexPath.row更新值0

并在cellForRowAt方法return cell之前将条件设置为

if checkUncheckArr[indexPath.row] == 0 {
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.non

}
else {
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark

}

答案 1 :(得分:0)

多数民众赞成在UITableView Cell中滚动时会重复使用它,并确保它在重用时恢复其UI状态

因此,创建一个数组来保存选定的indexPath

var selectedIndex : [IndexPath]! = [IndexPath]()

cellForRowAtIndexPath

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    if if selectedIndex.contains(indexPath) {
       cell.accessoryType = UITableViewCellAccessoryType.checkmark
    }
    else {
       cell.accessoryType = UITableViewCellAccessoryType.none
    }
    cell.textLabel?.text=dizi[indexPath.row]

    return cell
}

最后更新selectedIndexArray

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark
    {
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
        self.selectedIndex = selectedIndex.filter({
            return $0 != indexPath
        })
    }
    else
    {
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
        self.selectedIndex.append(indexPath)
    }

}