我在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
}
}
答案 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
方法。
并考虑使用结构而不是类。