如何在 Swift 4 中以编程方式注册 UITableViewHeaderFooterView?
Posted
技术标签:
【中文标题】如何在 Swift 4 中以编程方式注册 UITableViewHeaderFooterView?【英文标题】:How to programatically register a UITableViewHeaderFooterView in Swift 4? 【发布时间】:2018-12-09 10:23:45 【问题描述】:我需要我的 tableView 来触发事件:
override func tableView(_ tableView: UITableView, didEndDisplayingFooterView view: UIView, forSection section: Int)
要做到这一点,根据文档,我不能像这样向 tableView 添加视图:
tableView.tableFooterView = spaceView
在工作时,不会触发该函数,也不会使表出列页脚,尽管表可能会得到多长时间。
我无法在故事板/XIB 中执行此操作,因为是否添加页脚只是在运行时做出的决定。
因此,根据文档或至少我对它们的理解,我必须将“spaceView”设为 UITableViewHeaderFooterView 的子类,并且必须进行正式的“注册”才能将其添加到 tableView 中,如下所示:
let spaceView = UITableViewHeaderFooterView(reuseIdentifier: "emptyFooter")
tableView.register(spaceView, forHeaderFooterViewReuseIdentifier: "emptyFooter")
然后我得到一个编译错误:
Cannot invoke 'register' with an argument list of type '(UITableViewHeaderFooterView, forHeaderFooterViewReuseIdentifier: String)'
那么,尽管有文档,但有什么想法我是如何阅读文档的错误的?
【问题讨论】:
***.com/questions/36926612/… 不。再一次,正如我所说,没有 XIB,也没有返回默认 FOOTER VIEW 的方法,如下面的建议。 等等。您在表格视图的底部有一个页脚吗?还是您希望每个部分有一个页脚? 整个表格末尾的一个 - 只有一个部分。 在这种情况下,您必须使用tableView.tableFooterView = yourFooterView
。 didEndDisplayingFooterView
委托函数仅在节页脚时调用。你想用这个功能实现什么?
【参考方案1】:
你可以这样做:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return 45
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 60))
headerView.backgroundColor = UIColor(red: 30/255, green: 30/255, blue: 32/255, alpha: 1.0)
return headerView
【讨论】:
感谢您的帮助,但这对我不起作用。我需要有或没有 FOOTER,具体取决于其他函数中发生的其他代码和测试。这不是全球性的 - 总是返回这种视图类型的问题。【参考方案2】:你的问题的正确答案是:
class CustomTableViewHeaderFooterView: UITableViewHeaderFooterView
class CustomTableViewController: UITableViewController
override func viewDidLoad()
super.viewDidLoad()
tableView.register(CustomTableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "CustomTableViewHeaderFooterView")
然后你可以像这样使用注册的页眉/页脚视图:
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
return 44
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
let customFooterView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomTableViewHeaderFooterView")
// set up your footer view
return customFooterView
尽管您不必注册任何UITableViewHeaderFooterView
,但要实现您在 cmets 中解释的内容。相反,您可以使用表格视图的tableFooterView
并自己实现该功能。在你的 UITableViewController
类中试试这个:
override func viewDidLoad()
super.viewDidLoad()
let footerView = UIView()
footerView.backgroundColor = .orange
footerView.frame.size.height = 44
tableView.tableFooterView = footerView
var footerViewIsVisible = false
didSet
if !footerViewIsVisible && oldValue
tableViewDidEndDisplayingTableFooterView(tableView)
func tableViewDidEndDisplayingTableFooterView(_ tableView: UITableView)
print("didEndDisplayingTableFooterView")
tableView.tableFooterView = nil
override func scrollViewDidScroll(_ scrollView: UIScrollView)
if let tableFooterView = tableView.tableFooterView
let visibleRect = CGRect(origin: scrollView.contentOffset, size: scrollView.bounds.size)
self.footerViewIsVisible = visibleRect.intersects(tableFooterView.frame)
【讨论】:
【参考方案3】:感谢您的建议,但这些建议都没有解决问题,也没有找到解决方案。
相反,我拥有我想要的功能,只需 6 行代码的小功能和视图控制器上的一个私有属性。
一旦 tableView.footerView 进入“屏幕外”,它就会立即设置为 nil,并且它只会在我想要的时候创建。
【讨论】:
以上是关于如何在 Swift 4 中以编程方式注册 UITableViewHeaderFooterView?的主要内容,如果未能解决你的问题,请参考以下文章
当 UIStepper 在 Swift 4 中以编程方式点击时如何更改 UILabel 的文本,如果它们都在 UITableViewCell 中?
如何在 Swift 中以编程方式将 UILabel 对象居中?
使用 Cocoa 在 Swift 4.0 中以编程方式创建复选框的标准方法是啥?