如何在 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 = yourFooterViewdidEndDisplayingFooterView 委托函数仅在节页脚时调用。你想用这个功能实现什么? 【参考方案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 中以编程方式创建复选框的标准方法是啥?

在 Swift 4 中以编程方式将 UIImageView、UILabel 添加到 UIStackView

如何在 Swift 中以编程方式启用/禁用菜单对象

如何在swift中以编程方式减少obj文件