再次点击该行时,不会调用 UITableViewDelegate didDeselectRowAt 方法[重复]
Posted
技术标签:
【中文标题】再次点击该行时,不会调用 UITableViewDelegate didDeselectRowAt 方法[重复]【英文标题】:The UITableViewDelegate didDeselectRowAt method doesn't get called when the row is tapped again [duplicate] 【发布时间】:2018-04-16 12:42:59 【问题描述】:我有一个虚拟动态表视图。每个单元格只包含一个标签。第一次点击单元格时,会出现一个复选标记。第二次点击它,应该使单元格的accessoryType
成为none
。我实现了UITableViewDelegate
的didSelectRowAt
和didDeselectRowAt
方法。他们在这里:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
print ("TT Did select at indexPath \(indexPath)")
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
print ("TT didDeselect at \(indexPath)")
问题是,当我点击一个已经被点击的单元格(带有复选标记)时,didDeselectRowAt
方法不会被调用,而是didSelectRowAt
方法会再次被调用。 didDeselectRowAt
方法只有在我点击另一行时才会被调用。
我知道我错过了一些简单的东西,但无法弄清楚。您有什么想法会导致这种情况吗?
【问题讨论】:
didDeselectRowAt 方法在您选择与选择之前相同的单元格时未调用 @iParesh,是的,我完全忘记了这一点。谢谢提醒! 【参考方案1】:如果您在滚动tableView
时使用以下方法而不是所选行选择错位。 (multiple selection)
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
print ("TT Did select at indexPath \(indexPath)")
let cell: TableViewCell = self.tblVW.cellForRow(at: indexPath) as! TableViewCell
cell.accessoryType = .checkmark
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
print ("TT didDeselect at \(indexPath)")
let cell: TableViewCell = self.tblVW.cellForRow(at: indexPath) as! TableViewCell
cell.accessoryType = .none
我建议您在array
和cellForItem
方法中添加选定的行indexPath
,检查array
是否包含indexPath
?如果它包含而不是设置.checkmark
,否则设置.none
,如下所示
func numberOfSections(in tableView: UITableView) -> Int
return 1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 30
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell:TableViewCell = self.tblVW.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
cell.textLabel?.text = String.init(format: "Row %d", indexPath.row)
if arrIndexPaths.contains(indexPath)
cell?.accessoryType = .checkmark
else
cell?.accessoryType = .none
return cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
print ("TT Did select at indexPath \(indexPath)")
if (arrIndexPaths.contains(indexPath))
arrIndexPaths.remove(indexPath)
else
arrIndexPaths.add(indexPath)
self.tblVW.reloadData()
【讨论】:
我忘记了当allowsMultipleSelection
设置为true
时会调用didSelectRowAt
。没有它,您的解决方案是最好的,尽管我不需要保留IndexPaths
的数组。只有一个就足够了,因为用户只能检查一行。感谢您的回答!【参考方案2】:
确保选择类型为“多选”
【讨论】:
是的,在这种情况下它可以工作,我知道。但是属性设置为false
时是不是不能调用方法?【参考方案3】:
这很明显。根据https://developer.apple.com/documentation/uikit/uitableviewdelegate/1614877-tableview,只要您“选择”它,就会调用didSelect。保留一个名为“recentRow”的变量,该变量保留最后点击的行索引。如果再次是'didSelect',那么你可以去掉复选标记
【讨论】:
以上是关于再次点击该行时,不会调用 UITableViewDelegate didDeselectRowAt 方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在单元格编辑模式下,单击其他行时,不会更新kendo(可排序)网格值
C# 在 appdomain 调用方法中加载 dll,而不会再次加载 dll