Ios 如何在swift 2.0的UITextfield中只允许某些数字集
我有一个Ios 如何在swift 2.0的UITextfield中只允许某些数字集,ios,swift,uitextfield,swift2,Ios,Swift,Uitextfield,Swift2,我有一个UITextField,其中我得到了月份号作为输入。我成功地将UITextField中的字符数限制为2。但是我希望用户只输入从1到12的值,而不是其他值。当用户在func textField(textField:UITextField!,shouldChangeCharactersRange:NSRange,replacementString:string!)->Bool中键入数字时,必须同时执行此操作。如果我使用一个简单的If条件检查每个字符,并在else部分返回false,则文本字段
UITextField
,其中我得到了月份号作为输入。我成功地将UITextField中的字符数限制为2。但是我希望用户只输入从1到12的值,而不是其他值。当用户在func textField(textField:UITextField!,shouldChangeCharactersRange:NSRange,replacementString:string!)->Bool中键入数字时,必须同时执行此操作。如果我使用一个简单的If
条件检查每个字符,并在else
部分返回false,则文本字段将不允许我使用清除或重新键入任何其他字符。有人帮帮我
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
}
请参阅此链接--=>您可以这样定义字符的限制:-
#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));
}
-(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串
{
NSUInteger newLength=[textField.text length]+[string length]-range.length;
NSCharacterSet*cs=[[NSCharacterSet characterSetWithCharactersInString:仅限数字]逆变器集];
NSString*筛选=[[string componentsSeparatedByCharactersInSet:cs]componentsJoinedByString:@”“];
return([string isEqualToString:filtered])&&(newLength您可以通过检查shouldchangeCharactersRange中的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
}
}
func textField(textField:UITextField,shouldChangeCharactersRange:NSRange,replacementString:string)->Bool{
让inputStr=textField.text?.stringByAppendingString(字符串)
让inputInt=Int(inputStr!)
如果输入>0&&输入<13{
返回真值
}否则{
返回错误
}
}
将键盘类型设置为数字键盘
加上这个
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
}
func textField(textField:UITextField!,shouldChangeCharactersRange:NSRange,replacementString:string!)->Bool{
如果let text=textField.text{
let newStr=(文本为NSString)
.StringByReplacingCharactersRange(范围,带字符串:字符串)
如果我是空的{
返回真值
}
让intvalue=Int(newStr)
return(intvalue>=0&&intvalue检查此设置以限制数字,并仅允许数字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
}
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
如果textField==mobileNumber{
设aSet=NSCharacterSet(charactersIn:“0123456789”)。反转
让compSepByCharInSet=string.components(separatedBy:aSet)
让numberFiltered=compSepByCharInSet.joined(分隔符:“”)
让长度=(mobileNumber.text?.count)!+string.count-range.length
returnstring==numberFiltered&&length我只想根据前面的答案发布一个更简单的答案
在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
}
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
guard let text=textField.text else{
返回真值
}
let newStr=(文本为NSString)。replacingCharacters(in:range,with:string)
保护let intValue=Int(newStr)else{
返回真值
}
返回此函数中的intValue add if条件以检查文本字段的值是否小于等于12且大于等于1。我已经尝试过此代码,它也允许13到99。此外,如果使用if条件并返回false,则即使退格,我也无法再编辑文本字段。此目标c代码与上面的swift答案没有什么不同。这只是有字符限制的objective c版本。var length=(count(textField.text)+count(string)-range.length)
和返回长度<3
这是用于简单长度约束的swift 1.2如果执行else部分并且返回false
,则无法清除文本或重新输入文本。我不确定您的代码,但我已检查过,上面的代码没有阻止用户清除文本或重新输入文本。s对不起,我错了。你的代码也很好用,而且非常简单。这对我的代码非常有效var length=(count(textField.text)+count(string)-range.length)
,并返回为return length<3&(intvalue>0&&intvalue?true:false
是多余的return 1…12~=intvalue