正确隐藏和显示 TableViewCells?

Posted

技术标签:

【中文标题】正确隐藏和显示 TableViewCells?【英文标题】:Hide and Show TableViewCells properly? 【发布时间】:2017-09-11 21:32:12 【问题描述】:

我正在为我的应用程序制作一个表格视图控制器,它有不同的标题。 我正在使用一个自定义标题视图,其中有一个按钮。该按钮用于显示该部分的行。我将每个标题的节号保存在按钮的标签属性中。

我查看了 20 多个关于此的帖子,但他们都说将高度设置为 0 并隐藏单元格。这很荒谬,因为自动布局会产生大量错误并使应用程序滞后很多。

我所做的是制作 2 个不同的细胞。一个用于显示我的数据,另一个只是一个高度为 0 的空单元格。

然后在我的代码中,我有一个名为 openSection 的变量,它保存当前打开的部分编号。

所以现在当我点击按钮时,当前部分关闭,新部分打开。但是,有很多很多的问题。 例如,如果我向上滚动单元格会不断变化。 下一个问题是,如果我打开最后一个标题,我无法向上滚动到第一个标题,这真的很奇怪。

这是我点击按钮时的功能

func buttonTapped(_ sender: UIButton) 
    DispatchQueue.main.async 
        self.openSection = sender.tag
        self.tableView.reloadData()
        self.tableView.beginUpdates()
        self.tableView.endUpdates()
    
    print("Button tapped")


这是我的 cellForRowAt 函数

    if openSection == indexPath.section 
        print("cellForRowAt")
        print(openSection)
        let cell = tableView.dequeueReusableCell(withIdentifier: "treatmentCell", for: indexPath) as! TreatmentTableViewCell
        cell.name.text = self.treatments[indexPath.section].treatments[indexPath.row].name
        cell.price.text = self.treatments[indexPath.section].treatments[indexPath.row].price
        cell.details.text = self.treatments[indexPath.section].treatments[indexPath.row].details
        return cell

     else 
        let cell = tableView.dequeueReusableCell(withIdentifier: "emptyCell", for: indexPath)
        cell.isHidden = true
        return cell
    

这是我的 heightForRowAt 函数

    if openSection == indexPath.section 
        print("heightForRowAt")
        print(openSection)

        return self.tableView.rowHeight
     else 
        return 0
    

【问题讨论】:

【参考方案1】:

将您的代码更改为点击按钮的代码

    self.openSection = sender.tag
    let index = IndexPath(row: 0, section: openSection)

    DispatchQueue.main.async 
        self.tableView.reloadData()
        self.tableView.reloadSections(IndexSet(integer: self.openSection), with: .automatic)
        self.tableView.scrollToRow(at: index, at: .top, animated: true)
    

然后将部分中的行数更改为下面的代码

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

     else 
        return 0
    

【讨论】:

【参考方案2】:

您是否尝试从 tableView:numberOfRowsInSection: 返回 0 以获取隐藏部分?点击按钮时,您可以将表格视图告诉reloadSections:withRowAnimation:

【讨论】:

非常感谢,它就像一个该死的魅力!!!!然而唯一的问题是它不是从顶部开始的。它进入该部分的底部。有没有办法解决这个问题?

以上是关于正确隐藏和显示 TableViewCells?的主要内容,如果未能解决你的问题,请参考以下文章

TableviewCells 未按预期插入

在情节提要中使用自定义 tableviewcells 时,IBOutlet 为零

获取 TableviewCells 以显示从 firebase 提取的不同数据并在 CollectionView 中显示它们

searchBar 过滤 tableViewCells didSelectItemAt indexPath 显示在 navigationBar Title

屏幕外(不可见)TableViewCells 不设置动画

在自定义tableviewcells中添加约束的最佳位置在哪里?