斯威夫特,重复复选标记

时间:2018-02-15 16:32:30

标签: ios swift uitableview

var rennersArray = […..with 36 names]

var checkersOpFalse = [Bool](repeating: false, count: 36)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    cell.textLabel?.text = rennersArray[indexPath.section][indexPath.row]
    cell.accessoryType = checkersOpFalse[indexPath.row] ? .checkmark : .none

    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)

    if let cell = tableView.cellForRow(at: indexPath as IndexPath) {

        checkersOpFalse[indexPath.row] = !(cell.accessoryType == .checkmark)

        cell.accessoryType = checkersOpFalse[indexPath.row] ? .checkmark : .none

        if let cell = tableView.cellForRow(at: indexPath as IndexPath) {

            if cell.accessoryType == .checkmark {
                code code
            }

一切正常。 现在我在tableview中使用相同的代码,但现在重复检查标记。

有人如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您应该重写didSelectRowAt。它应该做的只是更新您的数据模型,然后重新加载该行。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)

    checkersOpFalse[indexPath.row] = !checkersOpFalse[indexPath.row]

    tableView.reloadRows(at: [ indexPath ], with: .fade)
}

这将所有逻辑配置为cellForRowAt中的单元格。

现在,分段数据显示错误复选标记的真正问题是由于checkersOpFalse是一个仅基于索引路径行的数组。当你有多个部分时,这显然不起作用。

您应该在checkersOpFalse上输入IndexPath字典。

var checkersOpFalse = [IndexPath: Bool]()

然后更新didSelectRowAt

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)

    checkersOpFalse[indexPath] = !checkersOpFalse[indexPath, default: false]

    tableView.reloadRows(at: [ indexPath ], with: .fade)
}

cellForRowAt

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    cell.textLabel?.text = rennersArray[indexPath.section][indexPath.row]
    cell.accessoryType = checkersOpFalse[indexPath, default: false] ? .checkmark : .none

    return cell
}