快速单击其中一个 tableview 单元格内的按钮后重新加载 tableview

Posted

技术标签:

【中文标题】快速单击其中一个 tableview 单元格内的按钮后重新加载 tableview【英文标题】:Reload tableview after clicking the button present inside one of the tableview cell in swift 【发布时间】:2020-10-13 04:01:38 【问题描述】:

我有一个包含单元格数量的表格视图。每个单元格都有一个按钮。通过单击按钮,将打开一个下拉框。我希望当我单击特定单元格的按钮时,将显示特定单元格的下拉框,而隐藏不同单元格的所有其他下拉框。

我的代码是

@IBAction func dropDown2ButtonAction(_ sender: UIButton)
    
    if buttonTag == getIndexPath()!.row
        if isdropDownSelected2
            isdropDownSelected2 = false
        
        else
            isdropDownSelected2 = true
        
    
    else
        if let index = getIndexPath()
            buttonTag = index.row
        
        isdropDownSelected2 = false
        
        delegate?.updateTableView(completion:  [self] (updated) in
            if updated
                
                isdropDownSelected2 = true
            
            
        )
    

获取索引路径

  func getIndexPath() -> IndexPath? 
        guard let superView = self.superview as? UITableView else 
            print("superview is not a UITableView - getIndexPath")
            return nil
        
       let indexPath = superView.indexPath(for: self)
        return indexPath
    

显示或隐藏我的 tableView 的代码

var isdropDownSelected2 = false
    didSet
        if isdropDownSelected2 == true
            showTable2()
        
        else
            hideTable2()
            
        
    


private func showTable2()
    
    tableView2.isHidden = false
    


private func hideTable2()
    tableView2.isHidden = true


更新我的表格视图的代码

func updateTableView(completion: @escaping (Bool) -> Void) 
    tableView.reloadData 
        completion(true)
    


extension UITableView 
    func reloadData(completion:@escaping ()->()) 
        UIView.animate(withDuration: 0, animations:  self.reloadData() )
             _ in completion() 
    


在我的表格视图 cellFor row at indexpath 函数中

 LcodeTableViewCell?.dropDownBox2.tag = indexPath.row
            LcodeTableViewCell?.delegate = self
            if LcodeTableViewCell?.tableView1.isHidden == false
                LcodeTableViewCell?.tableView1.isHidden = true
            
            if LcodeTableViewCell?.tableView2.isHidden == false
                LcodeTableViewCell?.tableView2.isHidden = true
            

这里的buttonTag是一个变量

var buttonTag = 0

我在这里做错了什么?我认为tableview重新加载问题就在这里。

【问题讨论】:

【参考方案1】:

很容易解决,

每次单击按钮时,都会在控制器中记录索引,然后重新加载 tableView。

在单元格配置中,如果单元格的indexPath与记录索引匹配,则其子表显示,其余子表隐藏。

如果按两次按钮,控制器中的记录索引为nil,然后重新加载tableView,所有cell的子表隐藏。


我命名模式、标记和配置


你的代码很混乱

根据您的代码,我认为LcodeTableViewCell 是一个对象,而不是一个类。

@IBAction func dropDown2ButtonAction(_ sender: UIButton)
    
    if buttonTag == getIndexPath()!.row

buttonTag == getIndexPath()!.row,永远是真的。

// 错误代码 ...

【讨论】:

以上是关于快速单击其中一个 tableview 单元格内的按钮后重新加载 tableview的主要内容,如果未能解决你的问题,请参考以下文章

当在同一个单元格内单击按钮时,如何在自定义表格视图单元格内隐藏/显示特定视图

发生单元格内容交互时更新 TableView 单元格高度

在tableview单元格内创建动态collectionView

完成在单元格内编辑 textview 后向 tableview 添加另一个单元格

将数据从firebase加载到集合单元格内的tableview

从相机单击后在 tableView 单元中添加图像