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.