swift - 当它在顶部时更改 UITableView 部分标题

标签 swift uitableview header

我正在使用 Xib 文件中的自定义 header 用于我的表格 View ,使用以下代码:

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
}

然后我想在滚动到顶部时更改标题 sectionName,我试过这段代码

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 转换为我的自定义类型吗?

最佳答案

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

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
    }
}

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

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")

}

实现委托(delegate)方法:

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
}

创建更新 header 的方法:

// 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
        }
    }
}

然后从 UIScrollViewDelegate 方法 scrollViewDidScroll 调用您的 updateHeaders():

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

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

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

关于swift - 当它在顶部时更改 UITableView 部分标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50345706/

相关文章:

ios - 我不明白 zoomToRect 在 Swift 中是如何工作的

Visual Studio 2015 中的 C#、Swift 和 Android

ios - 预加载 tableView 单元格并防止重新加载

iOS 根据条件为 UIView 交换类

file - 损坏的 .resources 文件。尝试读取 ResourceReader header 时出现意外的 EndOfStreamException

excel - 使用 VBA 搜索特定的 headers 名称,并将这些 headers 的数据分组在几个重命名列中

ios - 如何在 Swift 中发出 NSURLSession POST 请求

json - SwiftyJson 和 firestore 时间戳 swift

ios - 关闭之前的 VC 后仅重新加载新数据

html - 如何将标题 iframe 高度更改为增加的值?