I don't know why viewForHeaderInSection is not called in swift3. I've added heightForHeaderInSection in UITableView but not called unfortunately. Please help me to check how to fixed it.

func numberOfSectionsInTableView(_ tableView: UITableView) -> Int {
    return 3
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch (section) {
    case 0:
        return homeStrs.count
    case 1:
        return accountStrs.count
    case 2:
        return otherStrs.count
    default:
        return otherStrs.count
    }
}
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {
    let cell = menuTable.dequeueReusableCell(withIdentifier: "MenuCell", for: indexPath) as! MenuCell
    cell.layoutMargins = UIEdgeInsets.zero;
    cell.lbNoti.isHidden = true
    switch ((indexPath as NSIndexPath).section) {
    case 0:
        cell.lbMenuTitle?.text = homeStrs[(indexPath as NSIndexPath).row]
        cell.imgIcon.image = UIImage (named: homeImgStrs[(indexPath as NSIndexPath).row])
    case 1:
        cell.lbMenuTitle?.text = accountStrs[(indexPath as NSIndexPath).row]
        cell.imgIcon.image = UIImage (named: accountImgStrs[(indexPath as NSIndexPath).row])
    case 2:
        cell.lbMenuTitle?.text = otherStrs[(indexPath as NSIndexPath).row]
        cell.imgIcon.image = UIImage (named: otherImgStrs[(indexPath as NSIndexPath).row])
    default:
        cell.lbMenuTitle?.text = "Other"
    }
    return cell
}
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 40
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    switch (section) {
    case 1:
        let headerView = UIView(frame: CGRect(x: 0, y: 0, width: self.menuTable.frame.size.width, height: 30))
        let menuHeaderLabel = UILabel(frame: CGRect(x: 20, y: 0, width: self.menuTable.frame.size.width, height: 28))
        menuHeaderLabel.text = "Account Settings"
        headerView.addSubview(menuHeaderLabel)
        return headerView
    case 2:
        let headerView = UIView(frame: CGRect(x: 0, y: 0, width: self.menuTable.frame.size.width, height: 30))
        let menuHeaderLabel = UILabel(frame: CGRect(x: 20, y: 0, width: self.menuTable.frame.size.width, height: 28))
        menuHeaderLabel.text = "Others"
        headerView.addSubview(menuHeaderLabel)
        return headerView
    default:
        let headerView = UIView(frame: CGRect(x: 0, y: 0, width: self.menuTable.frame.size.width, height: 0))
        return headerView
    }
}
If someone else is having the same issue... Adding this line in viewDidLoad called the delegate methods therefore made the header appear:
self.tableView.estimatedSectionHeaderHeight = 80
You sure you've added UITableViewDelegate, UITableViewDataSource in your ViewController Class
In my case, adding self.tableView.sectionHeaderHeight = 80.0 to viewDidLoad did the magic.
Same issue occured with me that's because tableview find difficulties in calculating height for header but as I was using automatic height calculation from xCode 9, I cannot give any explicit height value as mentioned above. After some experimentation I got solution, we have to override this method as,
-(CGFloat)tableView:(UITableView *)tableView 
         estimatedHeightForHeaderInSection:(NSInteger)section
{
      return 44.0f;
}
Although I have checked both options
from storyboard as apple says, but still I got this weird error.
Please Note: This Error was shown only on IOS-10 version not on IOS-11 version. Maybe it's a bug from xCode. Thanks
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With