正确隐藏和显示TableViewCells?

时间:2017-09-11 21:32:13

标签: ios swift uitableview tableview

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

我已经查看过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
    }

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

将您的代码更改为按钮

    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
    }
}