iPhone 键盘的返回键会将光标移动到下一个文本字段

发布于 2024-08-28 01:25:27 字数 8813 浏览 4 评论 0原文

我有一个 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”,以便键盘消失。

I have a TableViewController that is using a grouped Style and has two(2) sections. The first section has 4 rows and the second section has 3 rows. I have placed a UILabel and a UITextField in each cell, and have a custom method(textFieldDone:) to handle the cursor movement to the next text field when the return key is press.

This works fine and dandy if there is only one section, but I have two :( and yes I need two:)

so I started codin' up an answer, but got results that just don't work, I did notice during my debugging that cell Identifier (I use Two) is only showing the one (in the debug consol) and it's the first one only (Generic Cell).

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

Now remember that the first section is working fine and the code for that method is this:

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

}

It was my idea to just create a second method (secondSectionTextFieldDone:) like this

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

}

but the result does not solve the issue.

so my question is, how can i get the cursor to jump to the next textfield in the section that it is in, If there is one, and if not, then send a message "resignFirstResponder" so that, the keyboard goes away.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

薄情伤 2024-09-04 01:25:27

实现 UITextFieldDelegate

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

实现此方法

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

implement UITextFieldDelegate

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

implement this method

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
 if(theTextField==yourFirstTextFeld){
     [yourSecondTextFeld becomeFirstResponder];
 }
 return YES;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文