📜  uitableview 在选择时没有突出显示 (1)

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

UITableView 在选择时没有突出显示

问题描述

在使用 UITableView 时,选定某一行后没有出现选中状态(如高亮或选中离开),导致用户无法确定已选中的行。

问题原因

选中状态的显示受到 UITableViewCell 的属性 isSelected 的控制。当用户点击某一行后,该行的 isSelected 属性会被设置为 true,同时 tableView 会调用 tableView(_:didSelectRowAt:) 方法,在该方法中可以添加选中时的交互逻辑。但是如果选中状态没有显示,可能是以下几种原因导致:

  • 未正确设置 UITableViewCell 的 selectionStyle 属性。
  • tableView(_:cellForRowAt:) 方法中未正确设置 isSelected 属性。
  • tableView(_:didSelectRowAt:) 方法中未正确处理选中状态。
解决方案
1. 设置 UITableViewCell 的 selectionStyle 属性

UITableViewCell 的 selectionStyle 属性决定了选中状态的显示方式。常用的属性值有:none(无选中状态)、gray(灰色背景,无高亮)和 default(蓝色背景,有高亮)。在创建 UITableView 时可以通过 IB 或代码设置 selectionStyle 属性。例如:

// 使用代码设置
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
    cell.selectionStyle = .default // 设置选中状态
    return cell
}
// 使用 IB 设置
tableView.cellLayoutMarginsFollowReadableWidth = false
tableView.separatorInset.left = 0
tableView.separatorInset.right = 0
tableView.separatorStyle = .none
tableView.tableFooterView = UIView()
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 44
tableView.register(UINib(nibName: "MyCell", bundle: nil), forCellReuseIdentifier: "cellId")

// 在 Storyboard 中设置 UITableViewCell 的 selectionStyle
2. 设置 UITableViewCell 的 isSelected 属性

tableView(_:cellForRowAt:) 方法中设置 UITableViewCell 对象的 isSelected 属性。例如:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
    cell.isSelected = selectedIndexPath == indexPath // 根据情况设置选中状态
    return cell
}
3. 处理选中状态

tableView(_:didSelectRowAt:) 方法中处理选中状态。如果需要改变 UITableViewCell 的状态,可以在方法中直接修改对应的 UITableViewCell 对象的属性;如果需要在选中状态上添加额外的交互逻辑,可以通过处理 sender 参数来实现。例如:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // 处理选中状态
    tableView.cellForRow(at: indexPath)?.isSelected = true
    
    // 处理额外的交互逻辑
    let cell = tableView.cellForRow(at: indexPath)
    // ...
}
总结

UITableView 的选中状态主要由 UITableViewCell 的 isSelected 属性控制,同时需要正确设置 selectionStyle 属性,并在 tableView(_:didSelectRowAt:) 方法中处理选中状态。通过以上几点,就可以实现 UITableView 的选中状态显示。