2010-04-06 14 views
6

Gruplandırılmış bir Stil kullanan ve iki (2) bölüme sahip bir TableViewController var. İlk bölüm 4 satır ve ikinci bölüm 3 satırdan oluşmaktadır. Her bir hücreye bir UILabel ve bir UITextField yerleştirdim ve dönüş tuşuna basıldığında imleç hareketini bir sonraki metin alanına işlemek için özel bir yönteme (textFieldDone :) sahip oldum.iPhone klavyenin dönüş tuşu imleci sonraki metin alanına taşıyacak

tek kısım olduğu takdirde bu ince ve züppe çalışır, ancak iki tane var :(ve evet ben :)

iki yüzden bir cevap kadar CODIN başladı, ama sadece yok sonuçlar aldık gerek iş, ben hata ayıklama sırasında fark ettim ki hücre tanımlayıcısı (iki tane kullanıyorum) yalnızca birini (hata ayıklama konsolunda) gösterir ve sadece ilk olanıdır (Jenerik Hücre).

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

Şimdi ilk bölüm iyi çalışıyor ve bu yöntemin kodu bu olduğunu unutmayın:

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

} 

Sadece bu

gibi ikinci yöntem (secondSectionTextFieldDone :) oluşturmak benim fikrimdi
-(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]; 

} 

ancak sonuç sorunu çözmez.

bu yüzden sorum, imlecin bulunduğu bölümdeki bir sonraki metin alanına atlamasını nasıl sağlayabilirim, eğer varsa, ve değilse, "resignFirstResponder" mesajını gönderin, böylece klavye gider.

cevap

31

uygulamak UITextFieldDelegate bu yöntemi

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

uygulamak

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