title: Push different views from a table
body: <p>I've been following a tutorial to implement a search bar.</p>
  
  <p>However I can't seem to push different views. Here is what my didsSelectRowAtIndexPath looks like. </p>
  
  <pre><code>- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  NSString *selectedCountry = nil;
  
  if(searching)
      selectedCountry = [copyListOfItems objectAtIndex:indexPath.row];
  else {
  
      NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
      NSArray *array = [dictionary objectForKey:@"Countries"];
      selectedCountry = [array objectAtIndex:indexPath.row];
  }
  
  //Initialize the detail view controller and display it.
  if ([[listOfItems  objectAtIndex:indexPath.row] isEqual:@"neon"]){
  Neon *abo = [[Neon alloc] initWithNibName:@"Neon" bundle:nil];
  //dvController.selectedCountry = selectedCountry;
  [self.navigationController pushViewController:abo animated:YES];
  [abo release];
  }
  
  }
  </code></pre>
  
  <p>And here is the debuger message when I click on neon: 
  2010-05-09 08:47:27.516 iTeachU[3821:307] <strong>* Terminating app due to uncaught exception 'NSRangeException', reason: '*</strong> -[NSMutableArray objectAtIndex:]: index 60 beyond bounds [0 .. 0]'
  *** Call stack at first throw:
  terminate called after throwing an instance of 'NSException'
  Program received signal:  “SIGABRT”.</p>
  
  <p>If anyone has a way to push views based on the cells text it would be greatly appreciated. Thanks</p>
  
  <p>Edit Entire .m </p>
  
  <pre><code>- (void)viewDidLoad {
  [super viewDidLoad];
  listOfItems = [[NSMutableArray alloc] init];
  
  NSArray *ElementsArray = [NSArray arrayWithObjects:@"Actinium",
                            @"Aluminium",
                            @"Americium",
                            @"Antimony",
                            @"Argon",
                            @"Arsenic",
                            @"Astatine",
                            @"Barium",
                            @"Berkelium", 
                            @"Beryllium",
                            @"Bismuth",
                            @"Bohrium",
                            @"Boron",
                            @"Bromine",
                            @"Cadmium",
                            @"Cesium",
                            @"Calcium",
                            @"Californium",
                            @"Carbon",
                            @"Cerium",
                            @"Chlorine",
                            @"Chromium",
                            @"Cobalt",
                            @"Copper",
                            @"Curium",
                            @"Darmstadtium",
                            @"Dubnium",
                            @"Dysprosium",
                            @"Einsteinium", 
                            @"Erbium",
                            @"Europium",
                            @"Fermium",
                            @"Fluorine",
                            @"Francium",
                            @"Gadolinium",
                            @"Gallium",
                            @"Germanium",
                            @"Gold",
                            @"Hafnium",
                            @"Hassium",
                            @"Helium",
                            @"Holmium",
                            @"Hydrogen",
                            @"Indium",
                            @"Iodine",
                            @"Iridium",
                            @"Iron",
                            @"Krypton",
                            @"Lanthanum",
                            @"Lawrencium",
                            @"Lead",
                            @"Lithium",
                            @"Lutetium",
                            @"Magnesium",
                            @"Manganese",
                            @"Meitnerium",
                            @"Mendelevium",
                            @"Mercury",
                            @"Molybdenum",
                            @"Neodymium",
                            @"neon",
                            @"Neptunium",
                            @"Nickel", 
                            @"Niobium",
                            @"Nitrogen",
                            @"Nobelium",
                            @"Osmium",
                            @"Oxygen", 
                            @"Palladium",
                            @"Phosphorus",
                            @"Platinum",
                            @"Plutonium",
                            @"Polonium",
                            @"Potassium ",
                            @"Praseodymium",
                            @"Promethium",
                            @"Protactinium", 
                            @"Radium", 
                            @"Radon",
                            @"Rhenium",
                            @"Rhodium",
                            @"Roentgenium",
                            @"Rubidium", 
                            @"Ruthenium",
                            @"Rutherfordium",
                            @"Samarium", 
                            @"Scandium",
                            @"Seaborgium", 
                            @"Selenium",
                            @"Silicon", 
                            @"Silver",
                            @"Sodium", 
                            @"Strontium",
                            @"Sulfur",
                            @"Tantalum",
                            @"Technetium",
                            @"Tellurium",
                            @"Terbium",
                            @"Thallium",
                            @"Thorium",
                            @"Thulium",
                            @"Tin",
                            @"Titanium",
                            @"Tungsten",
                            @"Ununbium",
                            @"Ununhexium",
                            @"Ununoctium",
                            @"Ununpentium",
                            @"Ununquadium", 
                            @"Ununseptium",
                            @"Ununtrium",
                            @"Uranium",
                            @"Vanadium",
                            @"Xenon", 
                            @"Ytterbium",
                            @"Yttrium",
                            @"Zinc",
                            @"Zirconium", nil];
  NSDictionary *ElementsDict = [NSDictionary dictionaryWithObject:ElementsArray     forKey:@"Elements"];
  
  
  [listOfItems addObject:ElementsDict];
  
  //Initialize the copy array.
  copyListOfItems = [[NSMutableArray alloc] init];
  
  //Set the title
  self.navigationItem.title = @"Elements";
  
  //Add the search bar
  self.tableView.tableHeaderView = searchBar;
  searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
  
  searching = NO;
  letUserSelectRow = YES;
  }
  
  -(IBAction) back:(id)sender{
  [self.navigationController popViewControllerAnimated:NO];   
  }
  // Override to allow orientations other than the default portrait orientation.
  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  // Return YES for supported orientations
  return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  }
  
  
  
  #pragma mark -
  #pragma mark Table view data source
  
  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  
  if (searching)
      return 1;
  else
      return [listOfItems count];
  }
  
  
  
  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  
  if (searching)
      return [copyListOfItems count];
  else {
  
      //Number of rows it should expect should be based on the section
      NSDictionary *dictionary = [listOfItems objectAtIndex:section];
      NSArray *array = [dictionary objectForKey:@"Elements"];
      return [array count];
  }
  }
  - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
  
  if(searching)
      return @"Search Results";
  
  if(section == 0)
      return @"Elements";
  }
  
  // Customize the appearance of table view cells.
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  
  static NSString *CellIdentifier = @"Cell";
  
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
  }
  
  // Configure the cell...
  
  if(searching) 
      cell.text = [copyListOfItems objectAtIndex:indexPath.row];
  else {
  
      //First get the dictionary object
      NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
      NSArray *array = [dictionary objectForKey:@"Elements"];
      NSString *cellValue = [array objectAtIndex:indexPath.row];
      cell.text = cellValue;
  }
  
  return cell;
  }
  
  - (NSIndexPath *)tableView :(UITableView *)theTableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  
  if(letUserSelectRow)
      return indexPath;
  else
      return nil;
  }
  
  
  - (void) searchBarTextDidBeginEditing:(UISearchBar *)theSearchBar {
  
  //This method is called again when the user clicks back from teh detail view.
  //So the overlay is displayed on the results, which is something we do not want to happen.
  if(searching)
      return;
  
  //Add the overlay view.
  if(ovController == nil)
      ovController = [[OverlayViewController alloc] initWithNibName:@"OverlayView" bundle:[NSBundle mainBundle]];
  
  CGFloat yaxis = self.navigationController.navigationBar.frame.size.height;
  CGFloat width = self.view.frame.size.width;
  CGFloat height = self.view.frame.size.height;
  
  //Parameters x = origion on x-axis, y = origon on y-axis.
  CGRect frame = CGRectMake(0, yaxis, width, height);
  ovController.view.frame = frame;    
  ovController.view.backgroundColor = [UIColor grayColor];
  ovController.view.alpha = 0.5;
  
  ovController.rvController = self;
  
  [self.tableView insertSubview:ovController.view aboveSubview:self.parentViewController.view];
  
  searching = YES;
  letUserSelectRow = NO;
  self.tableView.scrollEnabled = NO;
  
  //Add the done button.
  self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] 
                                             initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                                             target:self action:@selector(doneSearching_Clicked:)] autorelease];
  }
  
  - (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
  
  //Remove all objects first.
  [copyListOfItems removeAllObjects];
  
  if([searchText length] &gt; 0) {
  
      [ovController.view removeFromSuperview];
      searching = YES;
      letUserSelectRow = YES;
      self.tableView.scrollEnabled = YES;
      [self searchTableView];
  }
  else {
  
      [self.tableView insertSubview:ovController.view aboveSubview:self.parentViewController.view];
  
      searching = NO;
      letUserSelectRow = NO;
      self.tableView.scrollEnabled = NO;
  }
  
  [self.tableView reloadData];
  }
  
  - (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar {
  
  [self searchTableView];
  }
  
  - (void) searchTableView {
  
  NSString *searchText = searchBar.text;
  NSMutableArray *searchArray = [[NSMutableArray alloc] init];
  
  for (NSDictionary *dictionary in listOfItems)
  {
      NSArray *array = [dictionary objectForKey:@"Elements"];
      [searchArray addObjectsFromArray:array];
  }
  
  for (NSString *sTemp in searchArray)
  {
      NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch];
  
      if (titleResultsRange.length &gt; 0)
          [copyListOfItems addObject:sTemp];
  }
  
  [searchArray release];
  searchArray = nil;
  }
  
  - (void) doneSearching_Clicked:(id)sender {
  
  searchBar.text = @"";
  [searchBar resignFirstResponder];
  
  letUserSelectRow = YES;
  searching = NO;
  self.navigationItem.rightBarButtonItem = nil;
  self.tableView.scrollEnabled = YES;
  
  [ovController.view removeFromSuperview];
  [ovController release];
  ovController = nil;
  
  [self.tableView reloadData];
  }
  </code></pre>
  
  <p>// Override to support editing the table view.
      - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {</p>
  
  <pre><code>if (editingStyle == UITableViewCellEditingStyleDelete) {
      // Delete the row from the data source
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
  }   
  else if (editingStyle == UITableViewCellEditingStyleInsert) {
      // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
  }   
  </code></pre>
  
  <p>}
  */</p>
  
  <pre><code>#pragma mark -
  #pragma mark Table view delegate
  
  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  NSString *selectedCountry = nil;
  
  if(searching)
      selectedCountry = [copyListOfItems objectAtIndex:indexPath.row];
  else {
  
      NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
      NSArray *array = [dictionary objectForKey:@"Countries"];
      selectedCountry = [array objectAtIndex:indexPath.row];
  }
  
  //Initialize the detail view controller and display it.
  if ([[listOfItems  objectAtIndex:indexPath.row] isEqual:@"neon"]){
  Neon *abo = [[Neon alloc] initWithNibName:@"Neon" bundle:nil];
  //dvController.selectedCountry = selectedCountry;
  [self.navigationController pushViewController:abo animated:YES];
  [abo release];
  }
  
  }
  
  
  #pragma mark -
  #pragma mark Memory management
  
  - (void)didReceiveMemoryWarning {
  // Releases the view if it doesn't have a superview.
  [super didReceiveMemoryWarning];
  
  // Relinquish ownership any cached data, images, etc that aren't in use.
  }
  
  - (void)viewDidUnload {
  // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
  // For example: self.myOutlet = nil;
  }
  
  
  - (void)dealloc {
  [back release];
  [tableView release];
  [super dealloc];
  }
  
  
  @end
  </code></pre>