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

62 iphone uitextfield ipad ios swift

我希望用户只在a中输入数值UITextField.在iPhone上我们可以显示数字键盘,但在iPad上用户可以切换到任何键盘.

有没有办法限制用户只输入数字值UITextField

Mr *_*r H 77

这是我的2分.(仅在Swift 2上测试过)

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

  let aSet = NSCharacterSet(charactersInString:"0123456789").invertedSet
  let compSepByCharInSet = string.componentsSeparatedByCharactersInSet(aSet)
  let numberFiltered = compSepByCharInSet.joinWithSeparator("")
  return string == numberFiltered

}
Run Code Online (Sandbox Code Playgroud)

这只是一点点严格.也没有小数点.

希望能帮助到你 :)

PS:无论如何,我认为你照顾了代表.

更新:Swift 3.0:

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

    let aSet = NSCharacterSet(charactersIn:"0123456789").inverted
    let compSepByCharInSet = string.components(separatedBy: aSet)
    let numberFiltered = compSepByCharInSet.joined(separator: "")
    return string == numberFiltered
}
Run Code Online (Sandbox Code Playgroud)


Hir*_*hal 71

swift 3.0及以上版本的解决方案

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
  {
    let allowedCharacters = CharacterSet.decimalDigits
    let characterSet = CharacterSet(charactersIn: string)
    return allowedCharacters.isSuperset(of: characterSet)
  }
Run Code Online (Sandbox Code Playgroud)

  • 您的视图控制器应符合`UITextFieldDelegate`,在viewDidLoad中放置`yourNumbersTextField.delegate = self` (3认同)

iOS*_*iOS 17

在swift 4.1和Xcode 9.4.1中

UITextFieldDelegate添加到您的类

class YourViewController: UIViewController, UITextFieldDelegate
Run Code Online (Sandbox Code Playgroud)

然后在viewDidLoad()中编写此代码

mobileNoTF.delegate = self
Run Code Online (Sandbox Code Playgroud)

写下这个textfield委托函数

//MARK - UITextField Delegates
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    //For mobile numer validation
    if textField == mobileNoTF {
        let allowedCharacters = CharacterSet(charactersIn:"+0123456789 ")//Here change this characters based on your requirement
        let characterSet = CharacterSet(charactersIn: string)
        return allowedCharacters.isSuperset(of: characterSet)
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)


小智 12

Swift 2.0

仅允许数字和一个"." uitextfield中的十进制数.

func textField(textField: UITextField,shouldChangeCharactersInRange range: NSRange,replacementString string: String) -> Bool
{
    let newCharacters = NSCharacterSet(charactersInString: string)
    let boolIsNumber = NSCharacterSet.decimalDigitCharacterSet().isSupersetOfSet(newCharacters)
    if boolIsNumber == true {
        return true
    } else {
        if string == "." {
            let countdots = textField.text!.componentsSeparatedByString(".").count - 1
            if countdots == 0 {
                return true
            } else {
                if countdots > 0 && string == "." {
                    return false
                } else {
                    return true
                }
            }
        } else {
            return false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Raj*_*shi 9

在Swift 3中使用单个(.)点接受文本字段中的十进制值

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let inverseSet = NSCharacterSet(charactersIn:"0123456789").inverted

    let components = string.components(separatedBy: inverseSet)

    let filtered = components.joined(separator: "")

    if filtered == string {
        return true
    } else {
        if string == "." {
            let countdots = textField.text!.components(separatedBy:".").count - 1
            if countdots == 0 {
                return true
            }else{
                if countdots > 0 && string == "." {
                    return false
                } else {
                    return true
                }
            }
        }else{
            return false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,并非所有语言环境都使用".".作为小数点分隔符.您可能希望使用Locale.current.decimalSeparator. (4认同)

ndm*_*iri 7

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    // return true if the replacementString only contains numeric characters
    let digits = NSCharacterSet.decimalDigitCharacterSet()
    for c in string {
        if !digits.characterIsMember(c) {
            return false
        }
    }

    return true
}
Run Code Online (Sandbox Code Playgroud)

即使用户切换键盘或尝试将非数字字符串粘贴到文本字段中,此解决方案也将起作用.

确保设置delegate相应文本字段的属性.


Jam*_*mim 7

仅IPhone解决方案

无论您从哪个UITextField获取这些值,您都可以指定当某人触摸文本字段时要显示的键盘类型.

EG是纯数字键盘.

喜欢这个截图:

在此输入图像描述

Ipad的

iPad不支持数字键盘,因此您可以选择不支持iPad,验证提交后的字段,也可以按照其他建议在iPad上运行时创建理智的行为.

  • 这不回答这个问题.即使使用数字键盘,iOS也允许用户将非数字值粘贴到UITextField中,或允许iPad将键盘从数字切换出来. (6认同)
  • 这不是对这个问题的任何答案,既简单又不合适。问题**不是**询问如何更改键盘类型。问题**是询问如何限制输入。那些是不同的。 (2认同)

SPa*_*tel 5

使用数字格式化程序

斯威夫特 4.x

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
      let s = NSString(string: textField.text ?? "").replacingCharacters(in: range, with: string)
      guard !s.isEmpty else { return true }
      let numberFormatter = NumberFormatter()
      numberFormatter.numberStyle = .none
      return numberFormatter.number(from: s)?.intValue != nil
 }
Run Code Online (Sandbox Code Playgroud)


Aft*_*med 5

像这样扩展你的视图控制器:

class MyViewController: UIViewController, UITextFieldDelegate
Run Code Online (Sandbox Code Playgroud)

在 viewDidLoad 函数中,像这样扩展到您的文本字段:

myTextField.delegate = self
Run Code Online (Sandbox Code Playgroud)

然后使用以下函数:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let isNumber = CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: string))
    let withDecimal = (
        string == NumberFormatter().decimalSeparator &&
        textField.text?.contains(string) == false
    )
    return isNumber || withDecimal
}
Run Code Online (Sandbox Code Playgroud)

这将确保用户只能输入十进制数字。

Swift 4 + 仅接受数字并接受一个分隔符


Bli*_*nja -2

首先添加delegatekeyBoradTypetextField

textField.delegate=self; textField.keyboardType = UIKeyboardTypeNumberPad;

比必须使用textField.delegate这样的方法 -

- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString: (NSString *)string 
{
  if (!string.length)
  {
       return YES;
  }

  if ([string intValue])
  {
        return YES;
  }

  return NO;
}
Run Code Online (Sandbox Code Playgroud)