仅在特定扩展部分中的FooterView?

时间:2019-11-14 01:30:18

标签: ios swift uitableview

当在特定tableView中扩展任何部分时,我试图显示footerView。使用简单的footerView代码,页脚会显示在每个部分(折叠和展开)以及每个tableView中。有没有一种简单的方法可以将页脚限制为一个tableView,并且仅在扩展部分时才提供?

我在一个ViewController中有多个tableViews,所以我的标题和单元格由如下逻辑确定:

//...cellForRowAt
if tableView == someTableview {
    //...cell display logic 
} else if tableView == someOtherTableView {
   //...cell display logic
} 

这是我的部分扩展/折叠代码:

func numberOfSections(in tableView: UITableView) -> Int {
     return someSectionTitles.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  return sectionIsExpanded[section] ? (1+someArray) : 1
}

我正在尝试实现页脚代码,但是它显示在每个tableView中(以及折叠的节时):

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let footerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 40))
    footerView.backgroundColor = UIColor.blue
    return footerView
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 40
}

谢谢!

2 个答案:

答案 0 :(得分:1)

委托方法tableView(_:viewForFooterInSection:)返回一个UIView?,因此,如果您不希望给定节的页脚,则返回nil。如果以后要在扩展该节时添加页脚,请调用tableview.reloadSections(_:with:),然后在tableView(_:viewForFooterInSection:)中返回页脚视图。

编辑-参见示例游乐场:

import UIKit
import PlaygroundSupport

class ViewController: UITableViewController {
  var sections = (0..<10).map { $0 }
  var expandedSections = Set<Int>()
  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    cell.textLabel?.text = "Cell for section \(indexPath.section) item: \(indexPath.item)"
    return cell
  }
  override func numberOfSections(in tableView: UITableView) -> Int {
    return sections.count
  }
  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
  }
  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if expandedSections.contains(indexPath.section) {
      expandedSections.remove(indexPath.section)
    } else {
      expandedSections.insert(indexPath.section)
    }
    tableView.reloadData()
  }
  override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    guard expandedSections.contains(section) else {
      return nil
    }
    let footer = UIView(frame: .init(origin: .zero, size: .init(width: 500, height: 50)))
    footer.backgroundColor = .red
    return footer
  }
  override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    guard expandedSections.contains(section) else {
      return 0
    }
    return 44
  }
}

PlaygroundPage.current.liveView = ViewController()

答案 1 :(得分:0)

在开始讨论细节之前,最好使用===比较tableViews,以检查它是同一实例,而不是等效实例。

如果检查viewForFooterInSection中的tableView和部分,则此键

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
  if tableView === someTableview && section == 0 {
      let footerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 40))
      footerView.backgroundColor = UIColor.blue
      return footerView
  } else if tableView === anotherTableView & section == 1 {
    //etc
  }
  return nil. //if none of the specific criteria for a footer are met return nil 
}