グループ化されたスタイルを使用し、2 つのセクションを持つ TableViewController があります。最初のセクションには 4 つの行があり、2 つ目のセクションには 3 つの行があります。各セルに UILabel と UITextField を配置し、リターン キーが押されたときに次のテキスト フィールドへのカーソル移動を処理するカスタム メソッド (textFieldDone:) を用意しました。
セクションが1つしかない場合、これはうまく機能しますが、2つあります:(そして、はい、2つ必要です:)
だから私は答えをコーディングし始めましたが、うまくいかない結果が得られました.デバッグ中に、セル識別子(私はTwoを使用しています)が(デバッグコンソールで)1つだけを表示していて、それは最初のものだけであることに気付きました. (ジェネリックセル)。
- (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;
}
ここで、最初のセクションが正常に機能しており、そのメソッドのコードが次のようになっていることを思い出してください。
-(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];
}
このように 2 番目のメソッド (secondSectionTextFieldDone:) を作成するのが私の考えでした
-(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];
}
しかし、結果は問題を解決しません。
だから私の質問は、カーソルがあるセクションの次のテキストフィールドにカーソルをジャンプさせるにはどうすればよいですか。