title: Add separate title to each section of UITableView
body: <p>I'm learning creating table views in iOS. I know how to create a table of one or more sections, but I don't know how to add a title in front of each section.</p>
  
  <p>Here's my code.</p>
  
  <p>TableViewController.h</p>
  
  <pre><code>#import &lt;UIKit/UIKit.h&gt;
  @interface TableViewController : UIViewController &lt;UITableViewDelegate, UITableViewDataSource&gt;{
      NSMutableArray *tableDataSource;    
  }
  @end
  </code></pre>
  
  <p>TableViewController.m</p>
  
  <pre><code>#import "FourthViewController.h"
  @implementation TableViewController
  
  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
      self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
      if (self) {
          // Custom initialization
      }
      return self;
  }
  
  - (void)dealloc{
      [super dealloc];
      [tableDataSource release];
  }
  
  - (void)didReceiveMemoryWarning{
      // Releases the view if it doesn't have a superview.
      [super didReceiveMemoryWarning];
      // Release any cached data, images, etc that aren't in use.
  }
  
  #pragma mark - View lifecycle
  
  - (void)viewDidLoad{
      [super viewDidLoad];
  
      UITableView *table = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStyleGrouped];
      [table setDataSource:self];
      [table setDelegate:self];
      [table release];
  
      tableDataSource = [[NSMutableArray alloc]init];
  
      NSMutableArray* sec1 = [[NSMutableArray alloc] init];
      [sec1 addObject:@"1"];
      [sec1 addObject:@"2"];
      [sec1 addObject:@"3"];
  
      [tableDataSource addObject:sec1];
      [sec1 release];
  
      NSMutableArray* sec2 = [[NSMutableArray alloc] init];
      [sec2 addObject:@"One"];
      [sec2 addObject:@"Two"];
      [sec2 addObject:@"Three"];
  
      [tableDataSource addObject:sec2];
      [sec2 release];
  
      [self.view addSubview:table];
  
  }
  
  - (void)viewDidUnload{
      [super viewDidUnload];
      // Release any retained subviews of the main view.
      // e.g. self.myOutlet = nil;
  }
  
  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
      // Return YES for supported orientations
      return (interfaceOrientation == UIInterfaceOrientationPortrait);
  }
  
  #pragma mark - Table 
  
  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
      if ( tableDataSource == nil )
          return 1;
      return [tableDataSource count];
  }
  
  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {    
      NSInteger bucketCount = -1;
      NSObject *target_section;
      if ( tableDataSource == nil )
          return 0;
      if( ( bucketCount = [tableDataSource count] ) &lt; 1 || bucketCount &lt;= section || (target_section = [tableDataSource objectAtIndex:section ]) == nil )
          return 0;
      return [ (NSMutableArray*)target_section count ];
  }
  
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"Cell %i",indexPath.section]];
      if (cell == nil) 
          {
          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[NSString stringWithFormat:@"Cell %i",indexPath.section]] autorelease];
          }
  
  cell.textLabel.text = (NSString*)[ (NSMutableArray*)[tableDataSource objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
      return cell;
  }
  
  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    
      [tableView deselectRowAtIndexPath:indexPath animated:YES];
  }
  @end
  </code></pre>