首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Swift 4中编程注册UITableViewHeaderFooterView?

如何在Swift 4中编程注册UITableViewHeaderFooterView?
EN

Stack Overflow用户
提问于 2018-06-30 12:41:36
回答 3查看 4.9K关注 0票数 1

我需要我的tableView来启动一个事件:

代码语言:javascript
复制
override func tableView(_ tableView: UITableView, didEndDisplayingFooterView view: UIView, forSection section: Int)

为了做到这一点,根据文档,我不能只向tableView添加这样的视图:

代码语言:javascript
复制
tableView.tableFooterView = spaceView

它在工作时,不会使该函数被触发,也不会使表排掉页脚的队列,尽管表可能会有多长时间。

我不能在情节提要/ XIB中这样做,因为是否添加了页脚,这是一个只有在运行时才能做出的决定。

因此,根据文档,或者至少根据我对它们的理解,我必须将'spaceView‘作为UITableViewHeaderFooterView的一个子类,并且我必须做一个正式的“注册”才能将它添加到tableView中,如下所示:

代码语言:javascript
复制
let spaceView = UITableViewHeaderFooterView(reuseIdentifier: "emptyFooter")

tableView.register(spaceView, forHeaderFooterViewReuseIdentifier: "emptyFooter")

但是,我得到了一个编译错误:

代码语言:javascript
复制
Cannot invoke 'register' with an argument list of type '(UITableViewHeaderFooterView, forHeaderFooterViewReuseIdentifier: String)'

所以,尽管有医生,你知道我怎么看医生错了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-30 20:36:10

谢谢你的建议,但这些建议都没有解决问题,也没有找到解决办法。

相反,我拥有的功能与我想要的完全一样,只有6行代码的小函数和视图控制器上的一个私有属性。

一旦tableView.footerView“离开屏幕”,它就立即被设置为零,并且它只是在我想要的时候才创建的。

票数 0
EN

Stack Overflow用户

发布于 2018-06-30 13:31:54

你的问题的正确答案是:

代码语言:javascript
复制
class CustomTableViewHeaderFooterView: UITableViewHeaderFooterView { }

class CustomTableViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(CustomTableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "CustomTableViewHeaderFooterView")
    }
}

然后可以使用已注册的页眉/页脚视图,如下所示:

代码语言:javascript
复制
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。相反,您可以使用表视图的tableFooterView并自己实现该功能。在您的UITableViewController类中尝试如下:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-06-30 12:46:49

你可以这样做:

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51115023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档