UITableViewHeaderFooterView在首次加载时不显示自定义

时间:2017-01-24 03:47:11

标签: ios swift uitableview

使用Swift 3,我使用UITableViewHeaderFooterView的子类(称为HeaderView)作为TableView上的标题部分。

出列HeaderView后,我自定义了 (1)设置textLabel.textColor = UIColor.red,以及(2)向其添加子视图。

当应用程序首次加载时,表视图会加载标题,但它们(我假设是)“默认”视图(textLabel.textColor为灰色,没有我添加的子视图)。当我开始滚动并开始出列更多HeaderViews时,HeaderViews开始正确显示,直到最终没有更多'默认'格式化HeaderViews。

应用程序的后续加载不再显示“默认”视图。

考虑的替代方案

  • 我知道这可以通过让我的HeaderView成为子类来实现的 UITableViewCell并从故事板中自定义它,但那样 似乎更像是一种使用原型单元的解决方法 为标题
  • 指定的UITableViewHeaderFooterView
  • 同样可以使用XIB文件完成,但即使在Xcode 8中也是如此 创建一个不允许的UITableViewHeaderFooterView的子类 你要创建一个XIB文件(所以必须有一些原因..)

任何评论/解答解释为什么会发生这种情况以及如何解决它真的很感激!

更新

根据要求,我已经在代码中添加了以显示我已经完成的任务 - 您可以使用下面的代码重新创建问题,并且通常在Storyboard中设置TableViewController(Swift 3,Xcode 8.2,在iOS 10.2上模拟)对于iPhone 7)

ListTableViewController.swift

import UIKit

class ListTableViewController: UITableViewController {

    // List of titles for each header
    var titles: [String] {
        var titles = [String]()
        for i in 1...100 {
            titles.append("List \(i)")
        }
        return titles as [String]

    }

    // Register view for header in here
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(ListHeaderView.self, forHeaderFooterViewReuseIdentifier: "Header")
    }

    // Table view data source
    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let dequeuedCell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "Header")
        if let cell = dequeuedCell as? ListHeaderView {
            cell.title = titles[section]
        }
        return dequeuedCell
    }

    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 44
    }

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

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }

}

ListHeaderView.swift

import UIKit

class ListHeaderView: UITableViewHeaderFooterView {

    var title: String? {
        didSet {
            updateUI()
        }
    }

    private func updateUI() {
        textLabel?.textColor = UIColor.red
        textLabel?.text = title!
        let separatorFrame = CGRect(x: 0, y: frame.height-1, width: frame.width, height: 0.25)
        let separator = UIView(frame: separatorFrame)
        separator.backgroundColor = UIColor.red
        contentView.addSubview(separator)
    }

}

以下是灰色标题(初始加载时屏幕已满)以及滚动时开始显示的自定义红色标题的屏幕截图。

Header Views not showing customisations at first

2 个答案:

答案 0 :(得分:1)

对于任何感兴趣的人来说,似乎这是一个错误,此阶段的最佳解决方案是在tableView委托方法textColor的标题视图上配置willDisplayHeaderView等属性。在视图出现之前“最后一刻”执行此操作允许您覆盖系统尝试强制使用字体等的任何配置。

在此处找到答案 Troubles with changing the font size in UITableViewHeaderFooterView

答案 1 :(得分:0)

使用以下代码

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let dequeuedCell : ListHeaderView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "Header") as? ListHeaderView

        cell.title = titles[section]
    cell.tittle.textcolor = uicolor.red
    return dequeuedCell
}