Xcode tableView didSelectRowAt 无法正常工作

问题描述

当我点击一行时我期望发生的事情:行中的文本立即打印,灰色背景闪烁,选中标记立即打开/关闭

实际发生的情况:直到我单击不同的行才会打印文本,灰色背景不会闪烁,选中标记仅在我单击不同的行时更新。

enter image description here

let itemArray = ["Find Mike","Buy Eggos","Destroy Demagorgon"]

override func tableView(_ tableView: UITableView,diddeselectRowAt indexPath: IndexPath) {
    
    print(itemArray[indexPath.row])
    
    if tableView.cellForRow(at: indexPath)?.accessoryType == .checkmark {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
    } else {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
    }
    
    tableView.deselectRow(at: indexPath,animated: true)
}

我不知道为什么这不像我期望的那样工作。我使用打印语句来检查函数何时被调用,但我无法摆脱它只是在我期望的时候没有调用的事实。

答案

这是一个语法错误,我使用的是 diddeselectRowAt 而不是 didSelectRowAt。

解决方法

我认为简单地切换模型中的状态是一种更好的方法。向您的模型类添加一个表示当前状态的标志。

然后在您的 didDeselectRowAt 中设置标志并使用点击的 indexPath 调用 tableView.reloadItems。

在您的 cellForRow 中加载相应的模型对象并根据模型类的属性设置 accessoryType

,

您应该同时实现 didSelectRowAtdidDeselectRowAt?在 didSelect 上,打开复选标记。在 didDeselect 将其关闭。

如果您需要标志数据,最好将其存储在模型中(在您的代码中,它们存储在 UI/单元格中),并保持模型和单元格同步。

,

使用tableView的reloaddata()。我想,这会解决问题。