选择表格中的单元格无法正常工作

Posted

技术标签:

【中文标题】选择表格中的单元格无法正常工作【英文标题】:Selecting Cells in Table Not Working Correctly 【发布时间】:2016-10-14 14:50:28 【问题描述】:

我在 TableViewController 中有一个静态表。每当我选择一行时,它都会用灰色填充整个单元格。它对我点击的每一行都执行此操作。如果我使用:

cell.selectionStyle = .none

它将使单元格填充为白色。

Tableview 属性检查器:

TableViewCell 属性检查器:

TableViewController:

import UIKit

class OptionTableViewController: UITableViewController 

@IBOutlet var optionsTable: UITableView!

let defaults = UserDefaults.standard

let numberOfRows = [7,2]

let cellIdentifier = "OptionCells"

override func viewDidLoad() 
    super.viewDidLoad()

    optionsTable.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that con be recreated.

override func numberOfSections(in tableView: UITableView) -> Int 
    // #warning Incomplete implementation, return the number of sections
    return 2


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows
    var rows = 0
    if(section < numberOfRows.count)
        rows = numberOfRows[section]
    
    return rows


override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
    cell.selectionStyle = .none
 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)

    cell.textLabel?.text = optionSelections[indexPath.row]
    return cell


我相信我已经正确设置了所有内容。为什么点击单元格时它会填充单元格?

更新: 我更新了代码以显示我目前拥有的内容。

更新 2: 我添加了几张图片来展示表格在点击每个其他单元格之前和之后的样子。

更新 3: 我正在将单元格出列以将附件类型更改为复选标记。

之前:

之后:

【问题讨论】:

改变selectionStyle after 单元格被选中并不是很聪明;为什么你找不到这种一致是因为单元格被重复使用并且一些单元格已被选择(可能)并且它们的selectionStyle在上一个事件之后已经是.none @holex 这是一个错误,但即使将 selectionStyle 设置在正确的位置,它仍然会用灰色填充单元格。 尝试删除您的 didSelectRowAt 方法。它正在使一个单元格出列,它不应该这样做。我怀疑这些单元格位于“正确”单元格之上。尝试使用视图调试器进行检查。 另外,如果你的 tableView 是静态的,为什么还要让单元格出队? @pdbasdf 我将单元格出列的原因是我想在用户点击单元格时选中它。有没有更好的方法来检查单元格而不是在 didSelectRowAt 内? 【参考方案1】:

正如 cmets 中所讨论的,我认为这个问题是didSelectRow(at:) 方法中单元格出列的症状:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)

你应该改用

    let cell = tableView.cellForRow(at: indexPath)

这将获取当前位于给定 indexPath 的单元格(请注意,如果该 indexPath 已被滚动或从未出现在屏幕上,它可能会返回 nil)。出队让一个未使用的单元格进入给定的 indexPath - 然后(我认为)它位于现有单元格的前面 - 因此出现了奇怪的行为。

【讨论】:

【参考方案2】:

您需要在选择发生之前设置 selectionStyle。

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
    cell.selectionStyle = .none
    cell.selectedBackgroundView = UIView() // optional
    cell.selectedBackgroundView?.backgroundColor = UIColor.white // optional

【讨论】:

我试过这个,但现在我看不到我的标签,它仍然用灰色填充整个单元格。 我应该补充一点,当我尝试这样做时,我从 didSelectRowAt 中删除了 cell.selectionStyle = .none 行。 在使用静态单元格时可能有一些东西阻止了这种自定义,上面的代码肯定适用于动态单元格。您可以将标签字符串保存在静态数组中并将它们设置在 cellForRowAt 中吗? 我尝试将其设置为蓝色以查看是否可行,但它仍然显示为灰色。我在属性检查器中将其更改为什么似乎也无关紧要,它只是保持灰色。 完全删除你的 didSelectRowAtIndex 并测试

以上是关于选择表格中的单元格无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableview 单元格可访问性无法正常工作

表格单元格中的按钮无法点击

iOS 8 中的表格视图单元格自动布局

在每个单元格都包含表格视图的表格视图中选择新单元格时,无法取消选择先前选择的单元格

在表格视图中点击单元格不会做任何事情

谷歌表格中是不是有办法选择单元格列表作为数组用作连接表格中的参数?