 <p>The problem with the current code isn't completely clear to me as I don't know what doesn't happen what should happen or vice versa. So I'm still guessing a bit. But I see you are not implementing <a href="https://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView%3aviewForHeaderInSection%3a" rel="nofollow">viewForHeaderInSection</a> which is what I would use to implement custom headers. Also I think you need <a href="https://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView%3aheightForHeaderInSection%3a" rel="nofollow">heightForHeaderInSection</a> set to something different than 0 (obviously).</p> <pre><code>-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { // Simple on the fly generated UIView, you could also return your own subclass of UIView UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 18)]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, tableView.frame.size.width, 18)]; [label setFont:[UIFont boldSystemFontOfSize:12]]; label.text = [arrHeaders objectAtIndex:section]; return view; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; { // Should be same as UIView that you return in previous function return 18.0f; } </code></pre>