Xcode tableView didSelectRowAt 无法正常工作

Xcode tableView didSelectRowAt not working correctly

当我点击一行时我期望发生的事情:立即打印该行的文本,灰色背景闪烁,复选标记 on/off 立即出现。

实际发生了什么:在我单击不同的行之前不会打印文本,灰色背景不会闪烁,只有在我单击不同的行时才会更新复选标记。

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)
}

我不知道为什么这没有按我预期的方式工作。我使用 print 语句来检查函数何时被调用,但我无法忘记它只是没有在我期望的时候调用。

回答

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

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

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

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

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

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

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