2010-04-06 4 views
6

J'ai un TableViewController qui utilise un style groupé et a deux (2) sections. La première section a 4 rangées et la deuxième section a 3 rangées. J'ai placé un UILabel et un UITextField dans chaque cellule, et ai une méthode personnalisée (textFieldDone :) pour manipuler le mouvement de curseur au champ de texte suivant quand la clef de retour est pressée.La touche de retour du clavier de l'iPhone déplace le curseur sur le champ de texte suivant

Cela fonctionne très bien et dandy s'il n'y a qu'une seule section, mais j'ai deux :(et oui je besoin de deux :)

alors j'ai commencé Codin' jusqu'à une réponse, mais a obtenu des résultats tout simplement pas travail, j'ai remarqué lors de mon débogage que Identifier de cellule (J'utilise Deux) ne montre que celui (dans la console de débogage) et c'est le premier seulement (Cellule générique).

- (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; 
} 

Maintenant, rappelez que la première section fonctionne bien et le code de cette méthode est la suivante:

-(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 > 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]; 

} 

Il était mon idée de créer simplement une deuxième méthode (secondSectionTextFieldDone :) comme celui-ci

-(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 > 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]] && (nextCell.reuseIdentifier == string)) 
      nextField = (UITextField *)oneView; 
    } 

    [nextField becomeFirstResponder]; 

} 

mais le résultat ne résout pas le problème. Donc ma question est, comment puis-je obtenir le curseur pour passer au champ de texte suivant dans la section où il est, s'il y en a un, et si non, alors envoyer un message "resignFirstResponder" de sorte que, le clavier s'en va.

Répondre

31

mettre en œuvre UITextFieldDelegate

yourFirstTextFeld.delegate = self; 
yourSecondTextFeld.delegate=self; 

mettre en œuvre cette méthode

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
if(theTextField==yourFirstTextFeld){ 
    [yourSecondTextFeld becomeFirstResponder]; 
} 
return YES; 
} 
Questions connexes