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的片段:
- 检查允许的最大字符数。
- 检查有效的十进制数。
- 只检查数字 。
代码是UITextField
委托方法。 在使用此片段之前,您必须具有以下属性:
-
self.maxCharacters
-
self.numeric
//只有int字符。 -
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 }