在UITableView中只重新加载一个节头

Abh*_*tra 7 uitableview uikit ios

我正在使用自定义单元格作为我的部分标题UITableView.在那个单元格中有三个按钮.如果在该部分的单元格中单击了任何按钮,则应仅重新加载该自定义部分单元格,而不是任何行.这可能吗?

我使用以下代码重新加载该单元格:

tableViewHome.reloadSections([1], with: UITableViewRowAnimation.none)
Run Code Online (Sandbox Code Playgroud)

它隐藏了我的部分细胞并扭曲了整个桌子.

UPDATE

我正在使用UITableView并遵循我正在使用的代码:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        let cellHeader = tableViewHome.dequeueReusableCell(withIdentifier: "header") as! HeaderTableViewCell

        cellHeader.filter1btn.addTarget(self, action: #selector(filterBtnAction(_:)), for: .touchUpInside)
        cellHeader.filter2Btn.addTarget(self, action: #selector(filterBtnAction(_:)), for: .touchUpInside)
        cellHeader.filter3btn.addTarget(self, action: #selector(filterBtnAction(_:)), for: .touchUpInside)


        return cellHeader
    }


    @IBAction func filterBtnAction(_ sender: UIButton) {

        print(sender.tag)

        tableViewHome.reloadSections([1], with: UITableViewRowAnimation.none)



    }
Run Code Online (Sandbox Code Playgroud)

Mos*_*she 5

我有点不清楚这里发生了什么,但听起来这里有一个UITableView值得解释的概念:

UITableView有自己的单元格概念,实现为UITableViewCell,以及自己的页眉/页脚概念,实现为UITableViewHeaderFooterView

根据您的意思是这两者中的哪一个,您可以采取一些措施来获得预期的效果:

UITableViewCell方法:

如果您使用 aUITableViewCell作为部分的第一行来充当“标题”,并且您只想重新加载该行以排除该部分的其余部分,则可以调用yourTableViewInstance.reloadRows(at:with:) (Apple 文档)此方法采用IndexPaths数组和动画样式。您可以传入要重新加载的索引路径。

UITableViewHeaderFooterView方法:

如果您使用的是适当的,UITableViewHeaderFooterView那么您需要确保在重新加载该部分时提供适当的视图。Zack Shapiro概述了您在此答案中需要采取的步骤:

  1. 创建一个类,它是 的子类UITableViewHeaderFooterView
  2. 将其注册到您的UITableView实例。
  3. 然后在viewForHeaderInSection,你做let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! YourHeaderViewSubclass

他指出的最后一件事是:

具有欺骗性的事情是该函数UIView?在它真正需要dequeuedReusableHeaderFooterViewreloadData将导致它消失时调用返回。

这取决于您采用这两种实现路径中的哪一种,但这应该足以为您指明正确的方向。

编辑:

根据您添加的代码,看起来您正在调用yourTableViewInstance.dequeueReusableCell(withIdentifier:for:)而不是yourTableViewInstance.dequeueReusableHeaderFooterView(withIdentifier:)viewForHeaderInSection.

您需要有一个子类,UITableViewHeaderFooterView然后正确调用它。创建新的子类,然后更改:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        let cellHeader = tableViewHome.dequeueReusableCell(withIdentifier: "header") as! HeaderTableViewCell

   // ...
Run Code Online (Sandbox Code Playgroud)

对此:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        let cellHeader = tableViewHome.dequeueReusableHeaderFooterView(withIdentifier: "header") as! HeaderTableView

   // ...
Run Code Online (Sandbox Code Playgroud)

您需要在此处执行两个步骤:

  1. 创建一个新类,子类化UITableViewHeaderFooterView而不是UITableViewCell.
  2. 然后使用上面概述的适当的类。

  • 我在这里有点困惑。似乎答案匹配与问题不匹配,尽管它确实符合 OP 想要的。具体来说,问题是如何重新加载单个/特定的 Header 单元格。答案指出了使用“UITableViewHeaderFooterView”的“正确”方式,但没有回答如何使用该方法重新加载单个/特定标题。我假设目标是找到“reloadSectionIndexTitles()”,但只针对单个部分。[尽管 Apple 的文档说“沿表格视图的右侧重新加载索引栏中的项目。” 这令人困惑。] (3认同)