在 iOS 中的 UITextField 中允许单个数字 [英] Allowing single digit in UITextField in iOS

查看:21
本文介绍了在 iOS 中的 UITextField 中允许单个数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Verification ViewController,我通过短信获得了4位数的验证码,我需要输入这些验证码才能登录,我已经像这样创建了ViewController>

正如你所看到的四个 UITextField,我只需要为每个 UITextField 允许一个数字,

我尝试过的:我试图使用 shouldChangeCharactersInRange:method: ,但它没有被调用,我不知道出了什么问题,我想是因为 UITextFields在 UITableView 中,所以它不工作.

解决方案

你可以通过使用文本域的委托功能来像这样改变文本域.最初,您需要设置每个文本字段的委托和标签.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{if ((textField.text.length >= 1) && (string.length > 0)){NSInteger nextTag = textField.tag + 1;//尝试寻找下一个响应者UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];如果 (!nextResponder)nextResponder = [textField.superview viewWithTag:1];如果(下一个响应者)//找到下一个响应者,所以设置它.[nextResponder 成为FirstResponder];返回否;}返回是;}

Swift 2

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) ->布尔{//在文本字段中输入值if (textField.text?.characters.count < 1 && string.characters.count > 0){让 nextTag = textField.tag + 1;//获取下一个响应者var nextResponder = textField.superview?.viewWithTag(nextTag);if (nextResponder == nil){nextResponder = textField.superview?.viewWithTag(1);}textField.text = 字符串;nextResponder?.becomeFirstResponder();返回假;}else if (textField.text?.characters.count >= 1 && string.characters.count == 0){//从文本字段中删除值让previousTag = textField.tag - 1;//获取下一个响应者var previousResponder = textField.superview?.viewWithTag(previousTag);if (previousResponder == nil){previousResponder = textField.superview?.viewWithTag(1);}textField.text = "";previousResponder?.becomeFirstResponder();返回假;}返回真;}

Swift 4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) ->布尔{如果 textField.text!.count <1 &&string.count >0{让 nextTag = textField.tag + 1//获取下一个响应者var nextResponder = textField.superview?.viewWithTag(nextTag)if (nextResponder == nil){nextResponder = textField.superview?.viewWithTag(1)}textField.text = 字符串nextResponder?.becomeFirstResponder()返回假}否则如果 textField.text!.count >= 1 &&string.count == 0{//从文本字段中删除值让 previousTag = textField.tag - 1//获取下一个响应者var previousResponder = textField.superview?.viewWithTag(previousTag)if (previousResponder == nil){previousResponder = textField.superview?.viewWithTag(1)}textField.text = ""previousResponder?.becomeFirstResponder()返回假}返回真}

I have a Verification ViewController, I get 4 digit verification code by SMS and I need to enter those code to login, I have created the ViewController like this

As you can see four UITextFields, I need to allow only single digit for each UITextField,

What I tried: I was trying to use shouldChangeCharactersInRange:method: , but its not getting called, I don't know what's wrong, I think because UITextFields are in UITableView so it is not working.

解决方案

You can change the text field like this by using the delegate function of the text field. Initially, you need to set the delegate and the tag of each text field.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if ((textField.text.length >= 1) && (string.length > 0))
    {
        NSInteger nextTag = textField.tag + 1;
        // Try to find next responder
        UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
        if (! nextResponder)
            nextResponder = [textField.superview viewWithTag:1];

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

        return NO;
    }
    return YES;
}

Swift 2

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    // On inputing value to textfield
    if (textField.text?.characters.count < 1  && string.characters.count > 0){
        let nextTag = textField.tag + 1;

        // get next responder
        var nextResponder = textField.superview?.viewWithTag(nextTag);

        if (nextResponder == nil){
            nextResponder = textField.superview?.viewWithTag(1);
        }
        textField.text = string;
        nextResponder?.becomeFirstResponder();
        return false;
    }
    else if (textField.text?.characters.count >= 1  && string.characters.count == 0){
        // on deleting value from Textfield
        let previousTag = textField.tag - 1;

        // get next responder
        var previousResponder = textField.superview?.viewWithTag(previousTag);

        if (previousResponder == nil){
            previousResponder = textField.superview?.viewWithTag(1);
        }
        textField.text = "";
        previousResponder?.becomeFirstResponder();
        return false;
    }
    return true;
}

Swift 4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if textField.text!.count < 1  && string.count > 0{
        let nextTag = textField.tag + 1

        // get next responder
        var nextResponder = textField.superview?.viewWithTag(nextTag)

        if (nextResponder == nil){

            nextResponder = textField.superview?.viewWithTag(1)
        }
        textField.text = string
        nextResponder?.becomeFirstResponder()
        return false
    }
    else if textField.text!.count >= 1  && string.count == 0{
        // on deleting value from Textfield
        let previousTag = textField.tag - 1

        // get next responder
        var previousResponder = textField.superview?.viewWithTag(previousTag)

        if (previousResponder == nil){
            previousResponder = textField.superview?.viewWithTag(1)
        }
        textField.text = ""
        previousResponder?.becomeFirstResponder()
        return false
    }
    return true

}

这篇关于在 iOS 中的 UITextField 中允许单个数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆