UITextField应该只接受数字值

我有UITexfields我希望它应该只接受数字其他显示警报input一个数字值。 我希望motionSicknessTextFiled只能接受数字

NSString*dogswithMotionSickness=motionSicknessTextField.text; NSString*valueOne=cereniaTextField.text; NSString*valueTwo=prescriptionTextField.text; NSString*valueThree=otherMeansTextField.text; NSString*valueFour=overtheCounterTextField.text; 

无论你从哪个UITextField中获取这些值,都可以指定当某个人在文本字段中触及时想要显示的键盘types。

EG是一个数字键盘。

像这个截图一样:

只会显示数字键盘

在使用Xcode和Xcode中内置的Interface Builder的情况下,这很容易设置,但是如果您想以编程方式理解这一点,请查看Apple的UITextInputTraits协议参考页面,特别是keyboardType属性信息。

要过滤掉标点符号,请设置文本字段的委托并设置shouldChangeCharactersInRange方法:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {  NSCharacterSet *numbersOnly = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"]; NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:textField.text];  BOOL stringIsValid = [numbersOnly isSupersetOfSet:characterSetFromTextField];  return stringIsValid; } 

目标C

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (!string.length) return YES; if (textField == self.tmpTextField) { NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$"; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:nil]; NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString options:0 range:NSMakeRange(0, [newString length])]; if (numberOfMatches == 0) return NO; } return YES; } 

Swift 3.0

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if !string.characters.count { return true } do { if textField == self.tmpTextField { var newString = textField.text.replacingCharacters(inRange: range, with: string) var expression = "^([0-9]+)?(\\.([0-9]{1,2})?)?$" var regex = try NSRegularExpression(pattern: expression, options: NSRegularExpressionCaseInsensitive) var numberOfMatches = regex.numberOfMatches(inString: newString, options: [], range: NSRange(location: 0, length: newString.characters.count)) if numberOfMatches == 0 { return false } } } catch let error { } return true } 
 [textField setKeyboardType:UIKeyboardTypeNumberPad]; 

我已经实现了具有textFieldfunction的片段:

  1. 检查允许最大字符数。
  2. 检查有效的十进制数。
  3. 只检查数字

代码是UITextField委托方法。 在使用此片段之前,您必须具有以下属性:

  1. self.maxCharacters
  2. self.numeric //只有int字符。
  3. self.decimalNumeric //只有数字和“。”,“,”(对于特定的语言环境,如俄语)。

码:

 - (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if(self.numeric || self.decimalNumeric) { NSString *fulltext = [textField.text stringByAppendingString:string]; NSString *charactersSetString = @"0123456789"; // For decimal keyboard, allow "dot" and "comma" characters. if(self.decimalNumeric) { charactersSetString = [charactersSetString stringByAppendingString:@".,"]; } NSCharacterSet *numbersOnly = [NSCharacterSet characterSetWithCharactersInString:charactersSetString]; NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:fulltext]; // If typed character is out of Set, ignore it. BOOL stringIsValid = [numbersOnly isSupersetOfSet:characterSetFromTextField]; if(!stringIsValid) { return NO; } if(self.decimalNumeric) { NSString *currentText = [textField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; // Change the "," (appears in other locale keyboards, such as russian) key ot "." currentText = [currentText stringByReplacingOccurrencesOfString:@"," withString:@"."]; // Check the statements of decimal value. if([fulltext isEqualToString:@"."]) { textField.text = @"0."; return NO; } if([fulltext rangeOfString:@".."].location != NSNotFound) { textField.text = [fulltext stringByReplacingOccurrencesOfString:@".." withString:@"."]; return NO; } // If second dot is typed, ignore it. NSArray *dots = [fulltext componentsSeparatedByString:@"."]; if(dots.count > 2) { textField.text = currentText; return NO; } // If first character is zero and second character is > 0, replace first with second. 05 => 5; if(fulltext.length == 2) { if([[fulltext substringToIndex:1] isEqualToString:@"0"] && ![fulltext isEqualToString:@"0."]) { textField.text = [fulltext substringWithRange:NSMakeRange(1, 1)]; return NO; } } } } // Check the max characters typed. NSUInteger oldLength = [textField.text length]; NSUInteger replacementLength = [string length]; NSUInteger rangeLength = range.length; NSUInteger newLength = oldLength - rangeLength + replacementLength; BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound; return newLength <= _maxCharacters || returnKey; } 

演示:

在这里输入图像说明

修改Michael Dautermann的答案:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if(string.length > 0) { NSCharacterSet *numbersOnly = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"]; NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:string]; BOOL stringIsValid = [numbersOnly isSupersetOfSet:characterSetFromTextField]; return stringIsValid; } return YES; } 

这只是检查包含数值的String的函数

 +(BOOL) checkforNumeric:(NSString*) str { NSString *strMatchstring=@"\\b([0-9%_.+\\-]+)\\b"; NSPredicate *textpredicate=[NSPredicate predicateWithFormat:@"SELF MATCHES %@", strMatchstring]; if(![textpredicate evaluateWithObject:str]) { //////NSLog(@"Invalid email address found"); UIAlertView *objAlert = [[UIAlertView alloc] initWithTitle:APP_NAME message:@"please enter valid text." delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Close",nil]; [objAlert show]; [objAlert release]; return FALSE; } return TRUE; } 

检查提交button。

这里是Swift解决scheme:

在viewDidLoad中设置委托:

 _yourTextField.delegate = self 
 let _acceptableCharacters = "0123456789." func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if (string.characters.count == 0) { return true } if (textField == self._yourTextField) { let cs = NSCharacterSet(charactersInString: self._acceptableCharacters) let filtered = string.componentsSeparatedByCharactersInSet(cs).filter { !$0.isEmpty } let str = filtered.joinWithSeparator("") return (string != str) } return true } 

我只是修改了Michael的答案,使其实现起来更容易一些。 只要确保你的UITextfield的委托被设置为自己。

 yourTxtField.delegate = self; 

此外复制并粘贴到您的主文件的代码。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField == yourTxtField) { NSCharacterSet *numbersOnly = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"]; NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:string]; BOOL stringIsValid = [numbersOnly isSupersetOfSet:characterSetFromTextField]; return stringIsValid; }else { return YES; } } 

如果你想允许使用空格键,只需在CharactersInString的末尾放一个空格就可以了:

 @"0123456789" -> @"0123456789 " 

另外:

如果要限制string的长度,只需使用以下代码replaceif函数:

 if (textField == yourTxtField) { NSUInteger newLength = [textField.text length] + [string length] - range.length; NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"1234567890"] invertedSet]; NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; return (([string isEqualToString:filtered])&&(newLength <= 10)); } 

就我而言,最后的“10”代表字符的极限。

干杯! 🙂

这个答案在Swift 3中抛出了一些错误,下面是工作答案:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if string.characters.count == 0 { return true } do { if textField == self.numberTextField { let nString = textField.text as NSString? let newString = nString?.replacingCharacters(in: range, with: string) let expression = "^([0-9]+)?(\\.([0-9]{1,2})?)?$" let regex = try NSRegularExpression(pattern: expression, options: .caseInsensitive) let numberOfMatches = regex.numberOfMatches(in: newString! as String, options: [], range: NSRange(location: 0, length: (newString?.characters.count)!)) if numberOfMatches == 0 { return false } } } catch let error { } return true } 

迅速

 class ExampleVC: UIViewController { let numbers = "0123456789"; override func viewDidLoad() { super.viewDidLoad() let textfield = UITextField(frame: CGRectMake(20, 100, 300, 44)) //make some customization, if you want self.view.addSubview(textfield) textfield.delegate = self; } } extension ExampleVC: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { return string.characters.count > 0 ? numbers.contains(string) : true } } 

这里是swift 4的工作示例

 public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // Allow Backspace if string.count == 0 { return true } // Allow Only Valid Decimal Numbers if let textFieldText = textField.text { let finalText = (textFieldText as NSString).replacingCharacters(in: range, with: string) if Double(finalText) != nil { return true } } return false }