📜  didselectrowatindexpath 未调用 swift (1)

📅  最后修改于: 2023-12-03 15:00:24.739000             🧑  作者: Mango

didSelectRowAt 被调用失败

问题描述

当你在 UITableView 中点击单元格时,你期望 didSelectRowAt 方法被调用。但是,如果这个方法没有被调用,你就需要排查错误。以下是可能的原因和解决方案。

可能的原因
  • 没有遵循 UITableViewDelegate 协议或者没有将 UITableViewDelegate 协议指定给表视图。
  • 没有将 UITableViewDelegate 的代理对象指定给表视图。
  • 可能 UITableViewDelegate 协议方法被意外地修改或删除了。
  • 可能设置了锁定,禁用了 UITableView 的用户交互。
  • 可能没有正确地创建 UITableViewCell,没有在 cellForRow 中设置可互动状态或其它属性,例如 cell.userInteractionEnabled = true
  • 可能没有将用户交互(也称为选择)的行为设置为选择样式/行为。因此,即使用户点击了一个单元格,也不会触发 didSelectRowAt 方法。此时,可以通过给单元格设置 selectionStyle 属性来解决这个问题。
解决方法
  • 确保你的视图控制器遵循 UITableViewDelegate 协议。
  • 确保将 UITableViewDelegate 的代理对象指定为表视图的视图控制器。
  • 检查你的 UITableViewDelegate 协议方法是否被符号化了。你可以在 UITableViewDelegate 中手动添加 didSelectRowAt 方法,确保它调用了 UITableViewDelegate 原始实现。例如: super.tableView(tableView, didSelectRowAt: indexPath)
  • 确保表视图启用了用户交互操作。这可以通过设置 UITableViewisUserInteractionEnabled 属性实现。
  • 确保你为 UITableViewCell 设置交互性(也称为可选)状态。这可以在 cellForRow 方法中通过设置 cell.userInteractionEnabled = true 实现。
  • 如果你的单元格没有选择样式/行为,请为单元格设置 selectionStyle 属性。
代码示例
class YourViewController: UIViewController, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!
    var data = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self  // 确定代理
        tableView.dataSource = self
        data = ["Hello", "World", "Selection", "Failed"]
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Selected: ", data[indexPath.row])
    }
}

extension YourViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.selectionStyle = .default  // 设置选择样式
        cell.textLabel?.text = data[indexPath.row]
        cell.imageView?.image = UIImage(systemName: "info.circle")
        return cell
    }    
}
总结

以上就是在 UITableView 中,为什么 didSelectRowAt 方法可能没有被调用以及如何解决的一些常见原因。在遇到调试过程中遇到错误时,应该认真检查上述原因,然后根据具体情况解决问题。