如何使UITextField仅限输入一个文本/数字,并使用下一个/完成按钮在多个UITextField之间进行导航

3

我需要处理在多个UITextField之间导航,使用(下一个/完成按钮),现在我需要每个UITextField中只允许一个文本/数字,我们如何在UITextField中实现这一点,如下图所示

enter image description here

我最近使用了以下代码,并且能够成功实现,但是遇到了一个问题:当我首次输入文本/数字时,它被输入到UITextField中,当我第二次输入文本/数字时,它仅用于推到下一个UITextField。 我想要的是,当我第二次输入文本/数字时,它必须被推到下一个UITextField,并且值必须在下一个UITextField中输入

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.tag<10) {

        if ((textField.text.length >= 1) && (string.length > 0))
        {

            NSInteger nextText = textField.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [textField.superview viewWithTag:nextText];
            if (! nextResponder)
                [textField resignFirstResponder];
               // nextResponder = [textField.superview viewWithTag:1];

            if (nextResponder){
                // Found next responder, so set it.
                [nextResponder becomeFirstResponder];

                return NO;

            }

        }
    }

    return YES;

}

我用以下代码解决了我的问题,但是我还有一个问题。对于最后一个UITextField,我需要在它填满后立即使其resignFirstResponder。但是当前情况下,只有在用户点击下一个文本框后才会发生resignFirstResponder。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.tag<10) {

        if ((textField.text.length >= 1) && (string.length > 0))
        {

            NSInteger nextText = textField.tag + 1;
            UIResponder* nextResponder = [textField.superview viewWithTag:nextText];
            if (! nextResponder)
                [textField resignFirstResponder];
               if (nextResponder){
                    [nextResponder becomeFirstResponder];

                    UITextField* nextTextfield= (UITextField*) [textField.superview viewWithTag:nextText];

                    if ((nextTextfield.text.length < 1)){
                    [nextTextfield setText:string];
                    }
                    return NO;
                 }

        }
    }

    return YES;

}
3个回答

3
您可以通过使用textfield代理方法来实现此操作,您可以按顺序为每个文本字段设置标签,例如1、2、3...现在,在shouldChangeCharactersInRange方法中使用正确的逻辑,当您在文本框中键入一个文本/数字时,将下一个框设置为第一个响应者。
如下所示:
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {

    if ((textField.text.length >= 1) && (string.length > 0))
       {

            NSInteger nextText = textField.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [textField.superview viewWithTag:nextText];
        if (! nextResponder)
            nextResponder = [textField.superview viewWithTag:1];

           if (nextResponder)
               // Found next responder, so set it.
               [nextResponder becomeFirstResponder];

        return NO;
        }
    return YES;
    }

编辑:

如果您想在文本字段跳转时也显示输入的文本,可以在[nextResponder becomeFirstResponder]之后添加以下代码:

添加以下代码:

     UITextField nextTextfield= (UITextField) [textField.superview viewWithTag:nextText]; 
    [nextTextfield setText:string]; 

编辑最后一个文本框中的键盘重新响应器。

If you want resign responder for last textfield 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.tag<10) {

        if ((textField.text.length >= 1) && (string.length > 0))
        {

            NSInteger nextText = textField.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [textField.superview viewWithTag:nextText];
            if (! nextResponder)
                [textField resignFirstResponder];
            // nextResponder = [textField.superview viewWithTag:1];

            if (nextResponder){
                // Found next responder, so set it.
                [nextResponder becomeFirstResponder];
                UITextField *nextTextfield= (UITextField*) [textField.superview viewWithTag:nextText];
                if (nextTextfield.text.length<1) {
                    if(nextTextfield.tag==4){
                        [nextTextfield setText:string];
                        [nextTextfield resignFirstResponder];
                    }else{
                        [nextTextfield setText:string];
                    }


                }

                return NO;

            }

        }
    }

    return YES;

}

在这里,我们检查了最后一个文本标签,我检查了4标签的值。当您为最后一个文本字段输入值时,请将其放在条件中,这样它将重新签署键盘。希望这能帮助您。

我已经修改了问题,你能帮我解决最近的问题吗? - Nischal Hada
你有解决方案吗?对于最后一个UITextField,我需要在它被填充后立即使其resignFirstResponder。但是当前情况是,只有当它被填充并且用户点击下一个文本框时,resignFirstResponder才会发生。 - Nischal Hada
@nischalhada,请查看已编辑的答案,希望它符合您的要求。如果不是,请告诉我。希望对您有所帮助。 - user1548843
@nischal hada:我试过修改代码,而且它对我起作用。你是在resigning current textfield还是nextTextfield textfield?如果没有问题,我不认为returen NO会有问题,如果是这种情况,就像这样返回Yes然后尝试一下:if(nextTextfield.tag==4){[nextTextfield setText:string];[nextTextfield resignFirstResponder];return YES,} - user1548843
很棒,朋友,享受编码的乐趣。 - user1548843
显示剩余7条评论

2

如果您想在文本框中仅输入数字并设置文本框的长度,请尝试以下方法:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

// Check for non-numeric characters
NSUInteger lengthOfString = string.length;
for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) {
    unichar character = [string characterAtIndex:loopIndex];
    if (character < 48) return NO; // 48 unichar for 0
    if (character > 57) return NO; // 57 unichar for 9
}

// Check for total length
NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
if (proposedNewLength > 1) return NO;     //set your length here
return YES;
}

你能帮我点个赞吗? - Nischal Hada

1
设置文本字段的代理并实现以下代理方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 25) ? NO : YES;
}

设置UITextField的最大字符长度


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接