2010-04-06 10 views
6

Mam TableViewController, który używa stylu zgrupowanego i ma dwie (2) sekcje. Pierwsza sekcja ma 4 wiersze, a druga sekcja ma 3 wiersze. Umieściłem UILabel i UITextField w każdej komórce i mam niestandardową metodę (textFieldDone :), aby obsłużyć ruch kursora do następnego pola tekstowego po naciśnięciu klawisza Return.Klucz zwrotny klawiatury iPhone przesunie kursor do następnego pola tekstowego.

To działa cacy jeśli istnieje tylko jeden odcinek, ale mam dwa :(i tak muszę dwa :)

więc zacząłem codin' up odpowiedź, ale mam wyniki po prostu nie praca, zauważyłem podczas mojego debugowania, że ​​identyfikator komórki (używam dwóch) pokazuje tylko jeden (w konsoli debugowania) i jest to pierwszy tylko (komórka generyczna).

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

Teraz pamiętać, że pierwsza sekcja działa poprawnie i kod dla tej metody to:

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

} 

To był mój pomysł, aby po prostu utworzyć drugą metodę (secondSectionTextFieldDone :) jak ten

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

} 

, ale wynik nie rozwiązuje problemu.

Moje pytanie brzmi: w jaki sposób można uzyskać kursor, aby przejść do następnego pola tekstowego w sekcji, w której się znajduje, Jeśli istnieje, a jeśli nie, to wyślij komunikat "resignFirstResponder", aby klawiatura odchodzi.

Odpowiedz

31

realizacji UITextFieldDelegate

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

realizacji tego sposobu

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
if(theTextField==yourFirstTextFeld){ 
    [yourSecondTextFeld becomeFirstResponder]; 
} 
return YES; 
} 
Powiązane problemy