2010-04-06 14 views
6

Ho un TableViewController che utilizza uno stile raggruppato e ha due (2) sezioni. La prima sezione ha 4 righe e la seconda sezione ha 3 righe. Ho inserito un UILabel e un UITextField in ogni cella e ho un metodo personalizzato (textFieldDone :) per gestire il movimento del cursore sul campo di testo successivo quando viene premuto il tasto Invio.Il tasto di ritorno della tastiera di iPhone sposta il cursore sul campo di testo successivo

Questo funziona bene e dandy se v'è una sola sezione, ma ho due :(e sì, ho bisogno di due :)

così ho iniziato Codin' up una risposta, ma ha ottenuto i risultati che semplicemente non lo fanno lavoro, ho notato durante il mio debugging che l'identificatore di cella (io uso due) mostra solo quello (nella consolle di debug) ed è il primo solo (cella generica).

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

Ora ricordo che la prima sezione sta lavorando bene e il codice per quel metodo è questo:

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

} 

E 'stata una mia idea di creare solo un secondo metodo (secondSectionTextFieldDone :) Ti piace questa

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

} 

ma il risultato non risolve il problema.

quindi la mia domanda è, come posso ottenere il cursore per passare al prossimo campo di testo nella sezione in cui si trova, se ce n'è uno, e in caso contrario, quindi inviare un messaggio "resignFirstResponder" in modo che, la tastiera Va via.

risposta

31

attuare UITextFieldDelegate

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

implementare questo metodo

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