How to Implement Custom Table View Section Headers and Footers with Storyboard
Solution 1:
Just use a prototype cell as your section header and / or footer.
- add an extra cell and put your desired elements in it.
- set the identifier to something specific (in my case SectionHeader)
- implement the
tableView:viewForHeaderInSection:
method or thetableView:viewForFooterInSection:
method - use
[tableView dequeueReusableCellWithIdentifier:]
to get the header - implement the
tableView:heightForHeaderInSection:
method.
-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
static NSString *CellIdentifier = @"SectionHeader";
UITableViewCell *headerView = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (headerView == nil){
[NSException raise:@"headerView == nil.." format:@"No cells with matching CellIdentifier loaded from your storyboard"];
}
return headerView;
}
Edit: How to change the header title (commented question):
- Add a label to the header cell
- set the tag of the label to a specific number (e.g. 123)
- In your
tableView:viewForHeaderInSection:
method get the label by calling:
UILabel *label = (UILabel *)[headerView viewWithTag:123];
- Now you can use the label to set a new title:
[label setText:@"New Title"];
Solution 2:
I know this question was for iOS 5, but for the benefit of future readers, note that effective iOS 6 we can now use dequeueReusableHeaderFooterViewWithIdentifier
instead of dequeueReusableCellWithIdentifier
.
So in viewDidLoad
, call either registerNib:forHeaderFooterViewReuseIdentifier:
or registerClass:forHeaderFooterViewReuseIdentifier:
. Then in viewForHeaderInSection
, call tableView:dequeueReusableHeaderFooterViewWithIdentifier:
. You do not use a cell prototype with this API (it's either a NIB-based view or a programmatically created view), but this is the new API for dequeued headers and footers.
Solution 3:
In iOS 6.0 and above, things have changed with the new dequeueReusableHeaderFooterViewWithIdentifier
API.
I have written a guide (tested on iOS 9), which can be summarised as such:
- Subclass
UITableViewHeaderFooterView
- Create Nib with the subclass view, and add 1 container view which contains all other views in the header/footer
- Register the Nib in
viewDidLoad
- Implement
viewForHeaderInSection
and usedequeueReusableHeaderFooterViewWithIdentifier
to get back the header/footer