如何在 swift 2.0 中只允许 UITextfield 中的某些数字集

Posted

技术标签:

【中文标题】如何在 swift 2.0 中只允许 UITextfield 中的某些数字集【英文标题】:How to allow only certain set of numbers in a UITextfield in swift 2.0 【发布时间】:2016-01-07 07:26:32 【问题描述】:

我有一个UITextField,我在其中获取月份编号作为输入。我成功地将 UITextField 中的字符数限制为 2。但我希望用户只输入来自1 to 12 的值,仅此而已。这必须在用户键入数字时同时完成,即func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool。如果我使用简单的if 条件来检查每个字符并在else 部分返回false,则文本字段将不允许我使用清除或重新输入任何其他字符。谁来帮帮我。

【问题讨论】:

【参考方案1】:

设置键盘类型为数字键盘

添加这个

func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool 

    if let text = textField.text 

        let newStr = (text as NSString)
            .stringByReplacingCharactersInRange(range, withString: string)
        if newStr.isEmpty 
            return true
        
        let intvalue = Int(newStr)
        return (intvalue >= 0 && intvalue <= 12)
    
    return true

【讨论】:

感谢这对我的代码var length = (count(textField.text) + count(string) - range.length) 非常有用,并返回为return length &lt; 3 &amp;&amp; (intvalue &gt; 0 &amp;&amp; intvalue &lt;= 12) ? true : false ? true : false 是多余的return 1...12 ~= intvalue【参考方案2】:

您可以同时检查 shouldChangeCharactersInRange 中的 TextField 值。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
    let inputStr = textField.text?.stringByAppendingString(string)
    let inputInt = Int(inputStr!)
    if inputInt > 0 && inputInt < 13 
        return true
     else 
        return false
    

【讨论】:

如果执行else部分并返回false,则无法清除文本或重新输入文本。 我不确定你的代码,但我已经检查过了,上面的代码没有做任何事情,既不会阻止用户清除文本,也不会重新输入文本。 对不起我的错误。你的代码也很好用而且很简单【参考方案3】:

=> 你可以像这样定义字符的限制:-

#define NUMBERS_ONLY @"1234567890"

#define  CHARACTER_LIMIT 2

=> 并基于定义限制字符,您可以使用并尝试以下方法:-

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

        NSUInteger newLength = [textField.text length] + [string length] - range.length;

        NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];

        NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

        return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));

    

【讨论】:

这个客观的 c 代码与上面的快速答案没有什么不同。它只是带有字符限制的目标 c 版本。 var length = (count(textField.text) + count(string) - range.length)return length &lt; 3 这是用于简单长度约束的 swift 1.2【参考方案4】:
func textField(textField: UITextField,
    shouldChangeCharactersInRange range: NSRange,
    replacementString string: String) -> Bool 

        // Create an `NSCharacterSet` set which includes everything *but* the digits
        let inverseSet = NSCharacterSet(charactersInString:"0123456789").invertedSet

        // At every character in this "inverseSet" contained in the string,
        // split the string up into components which exclude the characters
        // in this inverse set
        let components = string.componentsSeparatedByCharactersInSet(inverseSet)

        // Rejoin these components
        let filtered = components.joinWithSeparator("")  // use join("", components) if you are using Swift 1.2

        // If the original string is equal to the filtered string, i.e. if no
        // inverse characters were present to be eliminated, the input is valid
        // and the statement returns true; else it returns false
        return string == filtered


查看此链接--Limit UITextField input to numbers in Swift

【讨论】:

在此函数中添加 if 条件以检查文本字段的值小于等于 12 且大于等于 1。 我已经尝试过这段代码,它也允许 13 到 99。另外,如果我使用 if 条件并返回 false,我将无法再编辑文本字段,甚至退格。【参考方案5】:

查看此项以设置限制数字并仅允许数字 0 到 9。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
    if textField == mobileNumber 
        let aSet = NSCharacterSet(charactersIn:"0123456789").inverted
        let compSepByCharInSet = string.components(separatedBy: aSet)
        let numberFiltered = compSepByCharInSet.joined(separator: "")
        let length = (mobileNumber.text?.count)! + string.count - range.length
        return string == numberFiltered && length <= LIMIT
    else if textField == userType 
        return false
    
    return true

【讨论】:

【参考方案6】:

我只是想根据之前的答案发布一个更简化的答案。

在 Swift 5.1 上测试

考虑到你已经设置了textField.keyboardType = .numberPad,那么你可以这样做:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
        guard let text = textField.text else 
            return true
        
        let newStr = (text as NSString).replacingCharacters(in: range, with: string)

        guard let intValue = Int(newStr) else 
            return true
        
        return intValue <= maxNumber // maxNumber: replace with your max number
    

您不需要验证intValue 是否大于或等于0,因为在numberPad 中您不能写入负值。

【讨论】:

以上是关于如何在 swift 2.0 中只允许 UITextfield 中的某些数字集的主要内容,如果未能解决你的问题,请参考以下文章

Realm Swift 2.0:“不允许操作”- 仅在设备上

如何在 Swift 2.0 中使用标签将 TextField 添加到 Cell

如何限制 UITextField 在 Swift 中只接受数字?

如何在 Swift 中只执行一次代码?

如何在离子 1 中只允许输入一个小数点

如何在 texbox 中只允许数字,但也允许使用法语键盘输入