在UITableView

时间:2017-07-03 14:12:06

标签: ios uitableview uikit

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

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

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

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

更新

我使用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)



    }

4 个答案:

答案 0 :(得分:4)

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

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

根据您的意思,您可以采取一些措施来达到预期的效果:

UITableViewCell方法:

如果你使用UITableViewCell作为一个部分的第一行来表现得像一个“标题”,你只想重新加载该行而不包括该部分的其余部分,你可以调用yourTableViewInstance.reloadRows(at:with:) (Apple Documentation)此方法采用IndexPath s数组和动画样式。您可以传入要重新加载的索引路径。

UITableViewHeaderFooterView方法:

如果你使用了正确的UITableViewHeaderFooterView,那么你需要确保在重新加载该部分时提供适当的视图。 Zack Shapiro概述了您需要采取的步骤this answer

  1. 创建一个属于UITableViewHeaderFooterView
  2. 的子类的类
  3. 将其注册到您的UITableView实例。
  4. 然后在viewForHeaderInSection中,您执行let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! YourHeaderViewSubclass
  5. 他指出的最后一件事是:

      

    欺骗性的事情是当UIView?确实需要dequeuedReusableHeaderFooterViewreloadData时,函数会调用viewForHeaderInSection,这会导致它消失。

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

    编辑:

    根据您添加的代码,您似乎在UITableViewHeaderFooterView内调用yourTableViewInstance.dequeueReusableCell(withIdentifier:for:)而不是yourTableViewInstance.dequeueReusableHeaderFooterView(withIdentifier:)

    您需要拥有func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let cellHeader = tableViewHome.dequeueReusableCell(withIdentifier: "header") as! HeaderTableViewCell // ... 的子类,然后才能正确调用它。创建新的子类,然后更改它:

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    
            let cellHeader = tableViewHome.dequeueReusableHeaderFooterView(withIdentifier: "header") as! HeaderTableView
    
       // ...
    

    到此:

    UITableViewHeaderFooterView

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

    1. 创建一个新类,继承UITableViewCell而不是fn main() { let mut a = [1,3,2]; let s = a.sort(); println!("{:?}", s); }
    2. 然后使用上面列出的相应课程。

答案 1 :(得分:1)

是的,确实如此。

假设这是您的方法的实现:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let customCell = .... as! YourCustomCell 
    customCell.someLabel.text = "Some Data"
    //... filling your curstom cell
    return customCell
}

你可以用这种方式改变它

func updateHeaderView(headerView:YourCustomCell, section: Int) {
    customCell.someLabel.text = "Some Data"
    //... filling your curstom cell  
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let customCell = .... as! YourCustomCell 
    self.updateHeaderView(customCell, section)
    return customCell
}

并随时再次致电self.updateHeaderView(customCell, section),例如

func buttonClicked() {
   let customCell = self.tableView.headerView(forSection: 0) as! YourCustomCell
   self.updateHeaderView(customCell, 0)
}

答案 2 :(得分:1)

我做了什么,工作得非常正确,请按照给出的答案:

SWIFT 3.1

第1步:

首先我拿了一个view xib,根据我的要求设计并在我要求的课程中注册。

其次,class HeaderView: UITableViewHeaderFooterView

的子类UITableViewHeaderFooterView

如下图所示:

enter image description here

在我要求的课程(这里是家庭课程)中,我确实为我的tableview注册了我的xib文件。

override func viewDidLoad() {
        super.viewDidLoad()
        tableViewHome.register(UINib(nibName: "HeaderView", bundle: nil), forHeaderFooterViewReuseIdentifier: "HeaderView")
}

第2步:

然后在我要求的课程中,我做了以下:

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

        let cellHeader = tableViewHome.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! HeaderView
        cellHeader.filterAction(cellHeader.filter1Btn)


        return cellHeader
    }

它开始按照我的要求工作,后来我在我的班级中添加了自定义委托以获得更多动作,但是通过子视图,它现在正在工作。

答案 3 :(得分:0)

我认为您的标题视图类正在扩展UITableViewHeaderFooterView类。在扩展名中添加功能

extension UITableViewHeaderFooterView{
     func reloadHeaderCell(){
        preconditionFailure("This method must be overridden")
    }
}

现在在下面的Header类中覆盖此

class HeaderView: UITableViewHeaderFooterView {
   override func reloadHeaderCell() {
      ////// add your logic to reload view
    }
}

现在,您只需在下面的行中调用即可刷新视图

self.tableView?.headerView(forSection:0)?.reloadHeaderCell()