首页 > 解决方案 > 在顶部时更改 UITableView 部分标题

问题描述

我使用以下代码将 Xib 文件中的自定义标题用于我的表格视图:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let result: Result = (self.responseData?.result![section])!

    let headerCell = Bundle.main.loadNibNamed("HeaderViewTableViewCell", owner: self, options: nil)?.first as!  HeaderViewTableViewCell
   headerCell.sectionName.text = "Title"
    if (section == 0) {
        headerCell.sectionName.textColor = UIColor(red: 49/255.0, green: 149/255.0, blue: 213/255.0, alpha: 1)
    }

    return headerCell
}

然后我想在滚动到顶部时更改标题部分名称,我已经尝试过这段代码

let topSection = self.mainTable .indexPathsForVisibleRows?.first?.section
let currentHeader : HeaderViewTableViewCell = self.mainTable .headerView(forSection: topSection!) as HeaderViewTableViewCell
currentHeader.sectionName.textColor = UIColor.red

但我收到此错误:无法转换“UITableViewHeaderFooterView?”类型的值?强制键入“HeaderViewTableViewCell”有没有办法将 headerView 转换为我的自定义类型?

标签: swiftuitableviewheader

解决方案


首先,我建议您使用UITableViewHeaderFooterView您的标题视图。您可以创建一个子类并添加自定义代码。对于这个例子,我将使用一个空的子类:

class HeaderView: UITableViewHeaderFooterView {
    override func prepareForReuse() {
        super.prepareForReuse()

        // set you default color (other properties) here.
        // when scrolling fast the view gets reused and sometimes
        // the view that's on top will suddenly appear on the bottom still with the previous values
        textLabel?.textColor = .black
    }
}

注册您的标题视图(我正在跳过所有其他不相关的代码):

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.register(HeaderView.self, forHeaderFooterViewReuseIdentifier: "Header")

    // If you have a nib file for your HeaderView then register nib instead
    // Make sure in our nib file you set class name to HeaderView
    // And the file name is also HeaderView.xib
    // tableView.register(UINib.init(nibName: "HeaderView", bundle: nil) , forHeaderFooterViewReuseIdentifier: "Header")

}

实现委托方法:

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

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "Header")
    view?.textLabel?.text = "Hello"
    return view
}

创建一个更新标头的方法:

// Iterates through section header views and 
// checks for positions in relation to the tableview offset
func updateHeaders() {
    var sectionHeaders: [Int: HeaderView?] = [:]

    var i = 0
    while i < numberOfSections {
        sectionHeaders[i] = tableView.headerView(forSection: i) as? HeaderView
        i += 1
    }

    let availableHeaders = sectionHeaders.flatMap { $0.value != nil ? $0 : nil }
    for (index, header) in availableHeaders {
        let rect = tableView.rectForHeader(inSection: index)

        if rect.origin.y <=  tableView.contentOffset.y + tableView.contentInset.top || index == 0 {
            header!.textLabel?.textColor = .red
        } else {
            header!.textLabel?.textColor = .black
        }
    }
}

updateHeaders()并从 UIScrollViewDelegate 方法调用您scrollViewDidScroll

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    updateHeaders()
} 

还要在视图显示之前更新标题(在出现任何滚动之前),为此使用 UITableViewDelegate 方法willDisplayHeaderView

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    updateHeaders()
}

推荐阅读