title: iPhone keyboard's return key will move cursor to next textfield
body: <p>I have a TableViewController that is using a grouped Style and has two(2) sections. The first section has 4 rows and the second section has 3 rows.  I have placed a UILabel and a UITextField in each cell, and have a custom method(textFieldDone:) to handle the cursor movement to the next text field when the return key is press.</p>
  
  <p>This works fine and dandy if there is only one section, but I have two :( and yes I need two:)</p>
  
  <p>so I started codin' up an answer, but got results that just don't work, I did notice during my debugging that cell Identifier (I use Two) is only showing the one (in the debug consol) and it's the first one only (Generic Cell).</p>
  
  <pre><code>    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  {
      UITableViewCell *cell   = nil;
  
      switch (indexPath.section) 
      {
          case AUTO_DETAILS:
          {
              static NSString *cellID = @"GenericCell";
  
              cell = [tableView dequeueReusableCellWithIdentifier:cellID];
  
              if (cell == nil)
              {
                  cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 
                                                 reuseIdentifier:cellID] autorelease];
  
                  UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 75, 25)];
                  label.tag           = kLabelTag;
                  label.font          = [UIFont boldSystemFontOfSize:14];
                  label.textAlignment = UITextAlignmentRight;
                  [cell.contentView addSubview:label];
                  [label release];
  
  
                  UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(90, 12, 200, 25)];
                  textField.clearsOnBeginEditing = NO;
                  [textField setDelegate:self];
                  [textField addTarget:self action:@selector(topTextFieldDone:) forControlEvents:UIControlEventEditingDidEndOnExit];
                  [cell.contentView addSubview:textField];
              }
  
              NSInteger   row         = [indexPath row];
              UILabel     *label      = (UILabel *)[cell viewWithTag:kLabelTag];
              UITextField *textField  = nil;
  
              for (UIView *oneView in cell.contentView.subviews)
              {
                  if ([oneView isMemberOfClass:[UITextField class]])
                      textField = (UITextField *)oneView;
              }
  
              label.text = [topCellLabels objectAtIndex:row];
              NSNumber *rowAsNum = [[NSNumber alloc] initWithInt:row];
  
  
              switch (row) 
              {
                  case kMakeRowIndex:
                      if ([[tempValues allKeys] containsObject:rowAsNum])
                          textField.text = [tempValues objectForKey:rowAsNum];
                      else
                          textField.text = automobile.make;
                      break;
                  case kModelRowIndex:
                      if ([[tempValues allKeys] containsObject:rowAsNum])
                          textField.text = [tempValues objectForKey:rowAsNum];
                      else
                          textField.text = automobile.model;
                      break;
                  case kYearRowIndex:
                      if ([[tempValues allKeys] containsObject:rowAsNum])
                          textField.text = [tempValues objectForKey:rowAsNum];
                      else
                          textField.text = automobile.year;
                      break;
                  case kNotesRowIndex:
                      if ([[tempValues allKeys] containsObject:rowAsNum])
                          textField.text = [tempValues objectForKey:rowAsNum];
                      else
                          textField.text = automobile.notes;
                      break;
                  default:
                      break;
              }
  
              if (textFieldBeingEdited == textField)
              {
                  textFieldBeingEdited = nil;
              }
  
              textField.tag = row;
              [rowAsNum release];
              break;
          }
          case AUTO_REGISTRATION:
          {
  
              static NSString *AutoEditCellID = @"AutoEditCellID";
  
              cell = [tableView dequeueReusableCellWithIdentifier:AutoEditCellID];
  
              if (cell == nil)
              {
                  cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 
                                                reuseIdentifier:AutoEditCellID] autorelease];
  
                  UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 75, 25)];
                  label.tag           = kLabelTag;
                  label.font          = [UIFont boldSystemFontOfSize:14];
                  label.textAlignment = UITextAlignmentRight;
                  [cell.contentView addSubview:label];
                  [label release];
  
  
                  UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(90, 12, 200, 25)];
                  textField.clearsOnBeginEditing = NO;
                  [textField setDelegate:self];
                  [textField addTarget:self action:@selector(bottomTextFieldDone:) forControlEvents:UIControlEventEditingDidEndOnExit];
                  [cell.contentView addSubview:textField];
              }
  
  
              NSInteger   row         = [indexPath row];
              UILabel     *label      = (UILabel *)[cell viewWithTag:kLabelTag];
              UITextField *textField  = nil;
  
              for (UIView *oneView in cell.contentView.subviews)
              {
                  if ([oneView isMemberOfClass:[UITextField class]])
                      textField = (UITextField *)oneView;
              }
  
              label.text = [bottomCellLabels objectAtIndex:row];
              NSNumber *rowAsNum = [[NSNumber alloc] initWithInt:row];
  
              switch (row) 
              {
                  case 0:
                      if ([[tempValues allKeys] containsObject:rowAsNum])
                          textField.text = [tempValues objectForKey:rowAsNum];
                      else
                          textField.text = automobile.vinNumber;
                      break;
                  case 1:
                      if ([[tempValues allKeys] containsObject:rowAsNum])
                          textField.text = [tempValues objectForKey:rowAsNum];
                      else
                          textField.text = automobile.policyNumber;
                      break;
                  case 2:
                      if ([[tempValues allKeys] containsObject:rowAsNum])
                          textField.text = [tempValues objectForKey:rowAsNum];
                      else
                          textField.text = automobile.licensePlate;
                      break;
                  default:
                      break;
              }
  
              if (textFieldBeingEdited == textField)
              {
                  textFieldBeingEdited = nil;
              }
  
              textField.tag = row;
              [rowAsNum release];
              break;
          }
          default:
              break;
      }
      return cell;
  }
  </code></pre>
  
  <p>Now remember that the first section is working fine and the code for that method is this:</p>
  
  <pre><code>-(IBAction)topTextFieldDone:(id)sender 
  {
      UITableViewCell *cell               = (UITableViewCell *)[[sender superview] superview];
      UITableView     *table              = (UITableView *)[cell superview];
      NSIndexPath     *textFieldIndexPath = [table indexPathForCell:cell];
  
      NSUInteger row = [textFieldIndexPath row];
      row++;
  
      if (row &gt; kNumOfEditableRows)
          row = 0;
  
      NSUInteger newIndex[] = {0, row};
      NSIndexPath     *newPath    = [[NSIndexPath alloc] initWithIndexes:newIndex length:2];
      UITableViewCell *nextCell   = [self.tableView cellForRowAtIndexPath:newPath];
      UITextField     *nextField = nil;
  
      for (UIView *oneView in nextCell.contentView.subviews) 
      {
          if ([oneView isMemberOfClass:[UITextField class]])
              nextField = (UITextField *)oneView;
      }
      [nextField becomeFirstResponder];
  
  }
  </code></pre>
  
  <p>It was my idea to just create a second method (secondSectionTextFieldDone:) like this</p>
  
  <pre><code>-(IBAction)bottomTextFieldDone:(id)sender 
  {
      UITableViewCell *cell               = (UITableViewCell *)[[sender superview] superview];
      UITableView     *table              = (UITableView *)[cell superview];
      NSIndexPath     *textFieldIndexPath = [table indexPathForCell:cell];
  
      NSUInteger row = [textFieldIndexPath row];
      row++;
  
      if (row &gt; 3)
          row = 0;
  
      NSUInteger newIndex[] = {0, row};
      NSIndexPath     *newPath    = [[NSIndexPath alloc] initWithIndexes:newIndex length:2];
      UITableViewCell *nextCell   = [self.tableView cellForRowAtIndexPath:newPath];
      UITextField     *nextField = nil;
  
      NSString *string = [NSString stringWithFormat:@"AutoEditCellID"];
      for (UIView *oneView in nextCell.contentView.subviews) 
      {
          NSLog(@"%@", nextCell.reuseIdentifier); /* DEBUG LOG */
          if ([oneView isMemberOfClass:[UITextField class]] &amp;&amp; (nextCell.reuseIdentifier == string))
              nextField = (UITextField *)oneView;
      }
  
      [nextField becomeFirstResponder];
  
  }
  </code></pre>
  
  <p>but the result does not solve the issue. </p>
  
  <p>so my question is, how can i get the cursor to jump to the next textfield in the section that it is in, If there is one, and if not, then send a message "resignFirstResponder" so that, the keyboard goes away.</p>