Клавиша возврата на клавиатуре iPhone перемещает курсор к следующему текстовому полю - PullRequest
6 голосов
/ 06 апреля 2010

У меня есть TableViewController, который использует сгруппированный стиль и имеет два (2) раздела. Первый раздел имеет 4 строки, а второй раздел имеет 3 строки. Я поместил UILabel и UITextField в каждую ячейку, и у меня есть собственный метод (textFieldDone :) для обработки перемещения курсора к следующему текстовому полю при нажатии клавиши возврата.

Это прекрасно работает, если есть только один раздел, но у меня есть два :( и да, мне нужно два:)

поэтому я начал набирать ответ, но получил результаты, которые просто не работают, я заметил во время отладки, что идентификатор ячейки (я использую два) показывает только один (в консоли отладки), и это только первый (общая ячейка).

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

}

Моя идея состояла в том, чтобы просто создать второй метод (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];

}

но результат не решает проблему.

поэтому мой вопрос: как я могу заставить курсор перейти к следующему текстовому полю в разделе, в котором оно находится, если оно есть, а если нет, то отправить сообщение «resignFirstResponder», чтобы клавиатура работала прочь.

1 Ответ

31 голосов
/ 10 июня 2010

реализовать UITextFieldDelegate

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

реализовать этот метод

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