再次点击该行时,不会调用 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。我实现了UITableViewDelegatedidSelectRowAtdidDeselectRowAt 方法。他们在这里:

   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
    

我建议您在arraycellForItem 方法中添加选定的行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(可排序)网格值

如何使用点击事件使其不会传播到视图

定义单元格更改时的Java jTable颜色行

C# 在 appdomain 调用方法中加载 dll,而不会再次加载 dll

未调用 UiTableView didSelectRowAt 方法

只调用一次 WebServcie?