我将如何允许在 iOS 中仅输入字母数字字符UITextField
?
问问题
32918 次
7 回答
63
将 UITextFieldDelegate 方法-textField:shouldChangeCharactersInRange:replacementString:
与 NSCharacterSet 一起使用,其中包含您要允许的字符的反转。例如:
// in -init, -initWithNibName:bundle:, or similar
NSCharacterSet *blockedCharacters = [[[NSCharacterSet alphanumericCharacterSet] invertedSet] retain];
- (BOOL)textField:(UITextField *)field shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters
{
return ([characters rangeOfCharacterFromSet:blockedCharacters].location == NSNotFound);
}
// in -dealloc
[blockedCharacters release];
请注意,您需要声明您的类实现了协议(即@interface MyClass : SomeSuperclass <UITextFieldDelegate>
)并将文本字段设置delegate
为您的类的实例。
于 2011-09-24T20:52:57.747 回答
12
斯威夫特 3 版本
目前接受的答案方法:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// Get invalid characters
let invalidChars = NSCharacterSet.alphanumerics.inverted
// Attempt to find the range of invalid characters in the input string. This returns an optional.
let range = string.rangeOfCharacter(from: invalidChars)
if range != nil {
// We have found an invalid character, don't allow the change
return false
} else {
// No invalid character, allow the change
return true
}
}
另一种同样功能的方法:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// Get invalid characters
let invalidChars = NSCharacterSet.alphanumerics.inverted
// Make new string with invalid characters trimmed
let newString = string.trimmingCharacters(in: invalidChars)
if newString.characters.count < string.characters.count {
// If there are less characters than we started with after trimming
// this means there was an invalid character in the input.
// Don't let the change go through
return false
} else {
// Otherwise let the change go through
return true
}
}
于 2017-03-17T01:03:41.783 回答
11
我找到了一个简单且有效的答案并想分享:
将事件 EditingChanged 的 UITextField 连接到以下 IBAction
-(IBAction) editingChanged:(UITextField*)sender
{
if (sender == yourTextField)
{
// allow only alphanumeric chars
NSString* newStr = [sender.text stringByTrimmingCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]];
if ([newStr length] < [sender.text length])
{
sender.text = newStr;
}
}
}
于 2011-09-25T14:28:16.337 回答
11
我就是这样做的:
// Define some constants:
#define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
#define NUMERIC @"1234567890"
#define ALPHA_NUMERIC ALPHA NUMERIC
// Make sure you are the text fields 'delegate', then this will get called before text gets changed.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// This will be the character set of characters I do not want in my text field. Then if the replacement string contains any of the characters, return NO so that the text does not change.
NSCharacterSet *unacceptedInput = nil;
// I have 4 types of textFields in my view, each one needs to deny a specific set of characters:
if (textField == emailField) {
// Validating an email address doesnt work 100% yet, but I am working on it.... The rest work great!
if ([[textField.text componentsSeparatedByString:@"@"] count] > 1) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:[ALPHA_NUMERIC stringByAppendingString:@".-"]] invertedSet];
} else {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:[ALPHA_NUMERIC stringByAppendingString:@".!#$%&'*+-/=?^_`{|}~@"]] invertedSet];
}
} else if (textField == phoneField) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:NUMERIC] invertedSet];
} else if (textField == fNameField || textField == lNameField) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:ALPHA] invertedSet];
} else {
unacceptedInput = [[NSCharacterSet illegalCharacterSet] invertedSet];
}
// If there are any characters that I do not want in the text field, return NO.
return ([[string componentsSeparatedByCharactersInSet:unacceptedInput] count] <= 1);
}
于 2011-09-24T20:48:27.677 回答
6
Swift 中的 RegEx 方式:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.isEmpty {
return true
}
let alphaNumericRegEx = "[a-zA-Z0-9]"
let predicate = NSPredicate(format:"SELF MATCHES %@", alphaNumericRegEx)
return predicate.evaluate(with: string)
}
于 2017-10-05T08:55:29.577 回答
1
对于 Swift:将事件 EditingChanged 的 UITextField 连接到以下 IBAction:
@IBAction func ActionChangeTextPassport(sender:UITextField){
if sender == txtPassportNum{
let newStr = sender.text?.stringByTrimmingCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet)
if newStr?.characters.count < sender.text?.characters.count{
sender.text = newStr
}
}
}
于 2016-10-02T08:28:11.743 回答
0
您将不得不使用textField delegate
方法,使用方法textFieldDidBeginEditing
,shouldChangeCharactersInRange
并textFieldDidEndEditing
检查字符。
请参阅此链接以获取文档。
于 2011-09-24T20:49:44.597 回答