клавиша Return клавиатуры iPhone переместит курсор в следующее текстовое поле

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

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

таким образом, я начал кодировать' ответ, но получил результаты, которые просто не работают, я действительно замечал во время своей отладки того Идентификатора ячейки (я использую Два), только показывает один (в консоли отладки), и это - первое только (Универсальная Ячейка).

    - (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" так, чтобы, клавиатура ушла.

6
задан Michael Dautermann 6 January 2014 в 14:20
поделиться

1 ответ

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

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

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

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
 if(theTextField==yourFirstTextFeld){
     [yourSecondTextFeld becomeFirstResponder];
 }
 return YES;
}
31
ответ дан 8 December 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: