如何使 UITextField 只有一个文本/数字并使用 Next / Done 按钮浏览多个`UITextField`

Posted

技术标签:

【中文标题】如何使 UITextField 只有一个文本/数字并使用 Next / Done 按钮浏览多个`UITextField`【英文标题】:How can I enable the UITextField to have only one text/number and navigate through multiple `UITextField`s using Next / Done Button 【发布时间】:2015-04-22 11:44:23 【问题描述】:

我必须使用(下一步/完成按钮)处理多个 UITextFields 的导航,现在我必须在每个 UITextField 中只允许一个文本/数字我们如何在 UITextField 中做到这一点,如图所示下面

我最近使用了以下代码并且也能够实现但遇到问题,当我第一次在UITextField 中输入文本/数字时,它正在输入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 。但目前当它是 fill up 并且用户 click next text 那么只有 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;


【问题讨论】:

【参考方案1】:

您可以通过使用 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 标记值你将你的最后一个 textfiedl 标记置于条件下,当你输入最后一个文本字段的值时,它将退出键盘。希望这会对你有所帮助。

【讨论】:

我已经修改了问题你能帮我解决最近的问题吗 您好,您可以通过添加这两个 UITextField 来做到这一点 nextTextfield= (UITextField) [textField.superview viewWithTag:nextText]; [nextTextfield 设置文本:字符串]; [nextResponder becomefirstResponder] 之后的行;行编辑答案 它正在工作,但是当行的所有 4 个文本字段都已满并且用户再次在文本字段中输入文本时,它开始更改下一个文本字段的文本。我想阻止它 当行的所有 4 个文本字段已满时。它跳到下一行第一个文本字段。你不想要这种行为吗? 只有当 UITextField 为空时,一切正常 【参考方案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;

【讨论】:

你能帮我投票吗【参考方案3】:

设置文本字段的委托并实现以下委托方法:

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

Set the maximum character length of a UITextField

【讨论】:

以上是关于如何使 UITextField 只有一个文本/数字并使用 Next / Done 按钮浏览多个`UITextField`的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UIButton 导致 UITextField 开始编辑文本

如何使 UITextField 的文本在 iPhone 中以首字母大写显示

如何使光标的高度与 UITextField 中的文本高度相同?

如何保存uitextfield以使文本保持从视图控制器到视图控制器

如何从 UI 文本字段中获取数字?

将 UITextField 限制在某个字符范围内