在iOS中允许UITextField中的单个数字

kri*_*ish 14 objective-c uitableview uitextfield ios swift

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

你可以看到四个UITextField,我需要只允许一个数字UITextField,

我尝试了什么:我试图使用shouldChangeCharactersInRange:method:,但它没有被调用,我不知道什么是错的,我认为因为UITextFields UITableView所以它不起作用.

Anu*_*oni 19

您可以使用文本字段的委托功能更改这样的文本字段.最初,您需要设置每个文本字段的委托和标记.

- (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;
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特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;
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特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

}
Run Code Online (Sandbox Code Playgroud)


Var*_*ria 11

如果您不想使用标记,请使用此代码,并且它比上面更好

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // On inputing value to textfield
        if ((textField.text?.characters.count)! < 1  && string.characters.count > 0){
            if(textField == txtOne)
            {
                txtTwo.becomeFirstResponder()
            }
            if(textField == txtTwo)
            {
                txtThree.becomeFirstResponder()
            }
            if(textField == txtThree)
            {
                txtFour.becomeFirstResponder()
            }

            textField.text = string
            return false
        }
        else if ((textField.text?.characters.count)! >= 1  && string.characters.count == 0){
            // on deleting value from Textfield
            if(textField == txtTwo)
            {
                txtOne.becomeFirstResponder()
            }
            if(textField == txtThree)
            {
                txtTwo.becomeFirstResponder()
            }
            if(textField == txtFour)
            {
                txtThree.becomeFirstResponder()
            }
            textField.text = ""
            return false
        }
        else if ((textField.text?.characters.count)! >= 1  )
        {
            textField.text = string
            return false
        }
        return true
    }
Run Code Online (Sandbox Code Playgroud)


Rom*_*nko 5

雨燕4

\n\n

受到 @Anurag Soni 和 @Varun Naharia 答案的启发

\n\n

变体A

\n\n
extension EnterConfirmationCodeTextField: UITextFieldDelegate {\n\n    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\n        guard let textFieldCount = textField.text?.count else { return false }\n\n        // \xd0\xa1losure\n        let setValueAndMoveForward = {\n            textField.text = string\n            let nextTag = textField.tag + 1\n            if let nextResponder = textField.superview?.viewWithTag(nextTag) {\n                nextResponder.becomeFirstResponder()\n            }\n        }\n\n        // \xd0\xa1losure\n        let clearValueAndMoveBack = {\n            textField.text = ""\n            let previousTag = textField.tag - 1\n            if let previousResponder = textField.superview?.viewWithTag(previousTag) {\n                previousResponder.becomeFirstResponder()\n            }\n        }\n\n        if textFieldCount < 1 && string.count > 0 {\n\n            setValueAndMoveForward()\n\n            if textField.tag == 4 {\n                print("Do something")\n            }\n\n            return false\n\n        } else if textFieldCount >= 1 && string.count == 0 {\n\n            clearValueAndMoveBack()\n            return false\n\n        } else if textFieldCount >= 1 && string.count > 0 {\n\n            let nextTag = self.tag + 1\n            if let previousResponder = self.superview?.viewWithTag(nextTag) {\n                previousResponder.becomeFirstResponder()\n\n                if let activeTextField = previousResponder as? UITextField {\n                    activeTextField.text = string\n                }\n            }\n\n            return false\n        }\n\n        return true\n\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

变体 B(另一种行为):

\n\n
extension EnterConfirmationCodeTextField: UITextFieldDelegate {\n\n        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\n            guard let textFieldCount = textField.text?.count else { return false }\n\n            // \xd0\xa1losure\n            let setValueAndMoveForward = {\n                textField.text = string\n                let nextTag = textField.tag + 1\n                if let nextResponder = textField.superview?.viewWithTag(nextTag) {\n                    nextResponder.becomeFirstResponder()\n                }\n            }\n\n            // \xd0\xa1losure\n            let clearValueAndMoveBack = {\n                textField.text = ""\n                let previousTag = textField.tag - 1\n                if let previousResponder = textField.superview?.viewWithTag(previousTag) {\n                    previousResponder.becomeFirstResponder()\n                }\n            }\n\n            if textFieldCount < 1 && string.count > 0 {\n\n                setValueAndMoveForward()\n\n                if textField.tag == 4 {\n                    print("Do something")\n                }\n\n                return false\n\n            } else if textFieldCount >= 1 && string.count == 0 {\n\n                clearValueAndMoveBack()\n                return false\n\n            } else if textFieldCount >= 1 {\n\n                setValueAndMoveForward()\n                return false\n            }\n\n            return true\n\n        }\n\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,我实现了这个功能:

\n\n

在此输入图像描述

\n\n

在最后一个textFiled为空的情况下,我只想切换到前一个textFiled。我尝试了所有这些方法。但对我来说,下面的方法更优雅,更有魅力:

\n\n

变体A

\n\n
class EnterConfirmationCodeTextField: UITextField {\n\n    // MARK: Life cycle\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n\n        delegate = self\n    }\n\n    // MARK: Methods\n\n    override func deleteBackward() {\n        super.deleteBackward()\n\n        let previousTag = self.tag - 1\n        if let previousResponder = self.superview?.viewWithTag(previousTag) {\n            previousResponder.becomeFirstResponder()\n\n            if let activeTextField = previousResponder as? UITextField {\n                if let isEmpty = activeTextField.text?.isEmpty, !isEmpty {\n                    activeTextField.text = String()\n                }\n            }\n        }\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

变体 B(另一种行为):

\n\n
class EnterConfirmationCodeTextField: UITextField {\n\n    // MARK: Life cycle\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n\n        delegate = self\n    }\n\n    // MARK: Methods\n\n    override func deleteBackward() {\n        super.deleteBackward()\n\n        let previousTag = self.tag - 1\n        if let previousResponder = self.superview?.viewWithTag(previousTag) {\n            previousResponder.becomeFirstResponder()\n        }\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

EnterConfirmationCodeTextField为每个文本字段分配并设置适当的tag值。

\n