iosswiftuitableviewuitableviewsectionheader

first tableview headerview disappears after scroll but every other one stays visible


So my goal is to have my first tableview headerview stay visible after scroll down. So I have a tableview with an inset grouped style so that the headers move up with the cells, when the view loads, the first header label is visible like so:

Header on view loaded

This is great. I love it. Now the issue is when I begin to scroll down in the tableview and the cell disappears out of the view, when I scroll back up the cell header is gone:

Missing cell header

The weird thing about this is that there's three sections with cells and the last section is out of the view when the view loads and requires the user to scroll down, but when I scroll down to it, scroll back up where it's not visible, and scroll down again, the header view is still there which I don't understand. Why does the first section header not have the same behaviour as the last section header?

Here is my code for the configuration of my headers:

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    
    if section == 0 {
        return "Account Settings"
    } else if section == 3 {
        return "Support & Info"
    } else if section == 6 {
        return "Notification Settings"
    } else {
        return "label"
    }
    
}

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    let header: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    
    
    if section == 0 || section == 3 || section == 6 {
        header.textLabel?.font = UIFont(name: Constants.AppFonts.menuTitleFont, size: 14.0)
    } else {
        header.textLabel?.alpha = 0
    }
    
    header.textLabel?.textAlignment = NSTextAlignment.left
    header.backgroundConfiguration = .clear()
    
    
}

Any suggestions?


Solution

  • Headers are reused. When you do something in a if, you need to "reset the value" in the else. Well, in your case you are doing it in the else (.alpha = 0), but you see the idea.

    So:

    if section == 0 || section == 3 || section == 6 {
        header.textLabel?.font = UIFont(name: Constants.AppFonts.menuTitleFont, size: 14.0)
    } else {
        header.textLabel?.alpha = 0
    }
    

    Should be:

    if section == 0 || section == 3 || section == 6 {
        header.textLabel?.font = UIFont(name: Constants.AppFonts.menuTitleFont, size: 14.0)
        header.textLabel?.alpha = 1
    } else {
        header.textLabel?.alpha = 0
    }