title: UITableView add row below selected row
body: <p>I had a working tableview where I could double-tap a cell and it would add an 'action' cell below which had four buttons programmed on it. 
  Today I added alphabetic sections to the tableview and a section index and I can no longer get this functionality to work. 
  I've added a whole range of NSLogs to the code to try and find the problem and I can't, it seems to be trying to add a row in the same section and one row further down than the cell tapped, so I'm not sure what the problem is. Would anyone have any idea what I'm doing wrong?
  If anyone can shed any light on this I would be hugely appreciative. (And apologies if my code is cumbersome or hard to follow, I'm new to this so feel free to suggest what I can improve!)</p>
  
  <pre><code>- (void)viewDidLoad
       {
       //I start with an array of objects, so I created two arrays; one containing the first letters of each Name, and a list of the number of objects that start with each of those names.
     nameIndex = [[NSMutableArray alloc] init];
     nameIndexCount = [[NSMutableDictionary alloc]init];   
      }
  
   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
       {
       return [nameIndex count];
        }
  
  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
       {
       if (self.actionRowIndexPath) {
  
       //Returns first letter of the section
       NSString *alphabet = [nameIndex objectAtIndex:section];
  
       //Returns the number of entries starting with that letter
      NSString *numberofRows = [nameIndexCount objectForKey:alphabet];
      int intNumberOfRows = ([numberofRows integerValue] + 1);
  
      return intNumberOfRows;
  } else {
  
      NSString *alphabet = [nameIndex objectAtIndex:section];
  
      NSString *numberofRows = [nameIndexCount objectForKey:alphabet];
      int intNumberOfRows = [numberofRows integerValue];
  
      return intNumberOfRows;
  }
  
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"newTableViewCell"];
  
      if (!cell) {
  
          cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"newTableViewCell"];
      }
      //Configure the cell
      UIImageView *imageView = [[UIImageView alloc]initWithFrame:cell.frame];
      UIImage *image = [UIImage imageNamed:@"LightGrey.png"];
      imageView.image = image;
  
      if ([indexPath isEqual:self.actionRowIndexPath]) {
  
  
          // Four UIButtons coded programmatically
  
      } else {
  
  
          Contact *p = [[[ContactStore sharedStore]allContacts]objectAtIndex:totalNumberOfRows];
          NSString *firstAndLastName = [NSString stringWithFormat:@"%@ %@", [p firstName], [p lastName]];
          indexPath = [self modelIndexPath:indexPath];
          cell.backgroundView = imageView;
          //        [cell.imageView setImage:smallThumbnailImage];
          [cell.imageView setImage:[p thumbnail]];
          [[cell textLabel]setBackgroundColor:[UIColor clearColor]];
          [[cell textLabel]setText:firstAndLastName];
          [[cell detailTextLabel]setBackgroundColor:[UIColor clearColor]];
          [[cell detailTextLabel]setText:[p phoneNumber]];
  
          totalNumberOfRows = totalNumberOfRows + 1;
      }
      return cell;
  }
  
      #pragma mark - Action Row Support
  
  -(NSIndexPath *)modelIndexPath: (NSIndexPath *)indexPath
  {
  
      if (self.actionRowIndexPath == nil) {
          return indexPath;
  
      }
  
      if ([indexPath row] &gt; [self.actionRowIndexPath row]) {
          return [NSIndexPath indexPathForRow:([indexPath row] - 1) inSection:indexPath.section];
  
      }
      return indexPath;
  
  }
  
   - (void)handleDoubleTap:(UITapGestureRecognizer *)recognizer {
  
  
      NSLog(@"Double tap");
  
      CGPoint p = [recognizer locationInView:self.tableView];
  
      NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
  
  
      NSIndexPath *pathToDelete = self.actionRowIndexPath;
  
      _selectedIndexPath = [self modelIndexPath:_selectedIndexPath];
  
      //Is the user deselecting current row?
      if (_actionRowIndexPath) {
          [self.tableView deselectRowAtIndexPath:_selectedIndexPath animated:NO];
          self.selectedIndexPath = nil;
          self.actionRowIndexPath = nil;
      } else {
          //Selecting a new row
          self.selectedIndexPath = indexPath;
  
          self.actionRowIndexPath= [NSIndexPath indexPathForRow:([indexPath row] + 1) inSection:[indexPath section]];
      }
  
      [self.tableView beginUpdates];
      if (pathToDelete) {
          [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:pathToDelete] withRowAnimation:UITableViewRowAnimationAutomatic];
  
      }
      if (self.actionRowIndexPath) {
          [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:self.actionRowIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
  
      }
      [self.tableView endUpdates];  
  }
  </code></pre>