当在特定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
}
谢谢!
答案 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
}