斯威夫特| UIViewTable在屏幕外滚动时会更改选中标记

时间:2019-03-10 06:45:34

标签: ios swift uitableview

我在TableView中有一个TableViewCells列表(todoList.items)。我可以轻松切换选中标记,并且可以正常工作。但是,当单元格滚动到表格视图的边缘时,复选标记会意外地自身切换。

在我的视图控制器中

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ChecklistItem", for: indexPath)
    let item = todoList.items[indexPath.row]
    configureText(for: cell, with: item)
    configureCheckmark(for: cell, with: item)

    return cell
}

// **EDIT**
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let cell = tableView.cellForRow(at: indexPath) {
        let item = todoList.items[indexPath.row]
        configureCheckmark(for: cell, with: item)
        tableView.deselectRow(at: indexPath, animated: true)
    }
}

func configureCheckmark(for cell: UITableViewCell, with item: ChecklistItem) {
    cell.accessoryType = item.checked ? .checkmark : .none
    item.toggleChecked()
}

// **END EDIT**

TodoList.swift

class TodoList {

    var items: [ChecklistItem] = []

    init() {
        // Create some demo items
        items.append(ChecklistItem(text: "Take a jog"))
        items.append(ChecklistItem(text: "Watch a movie"))
        items.append(ChecklistItem(text: "Code an app"))
        items.append(ChecklistItem(text: "Walk the dog"))
        items.append(ChecklistItem(text: "Study design patterns"))
    }

    func newItem() -> ChecklistItem {
        items.append(ChecklistItem(text: "NEW ITEM"))
        return items[items.count-1]
    }

}

ChecklistItem.swift

class ChecklistItem {

    var text = ""
    var checked = true

    init(text: String) {
        self.text = text
    }

    func toggleChecked() {
        checked = !checked
    }

}

1 个答案:

答案 0 :(得分:1)

发生错误是因为您在checked中始终总是切换configureCheckmark状态。因此,每当为此行调用cellForRow时,状态都会被切换。

实际上,不需要额外的方法configureCheckmark。将行设置为cellForRow中的复选标记,但不要更改状态。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ChecklistItem", for: indexPath)
    let item = todoList.items[indexPath.row]
    configureText(for: cell, with: item)
    cell.accessoryType = item.checked ? .checkmark : .none

    return cell
}

didSelectRowAt中切换模型中的checked并重新加载行

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    todoList.items[indexPath.row].checked.toggle()
    tableView.reloadRows(at: [indexPath], with: .none)
}

toggleChecked()中的方法ChecklistItem也很多余。 toggle()中有一个Bool方法。

并考虑使用结构而不是类。