【发布时间】:2014-07-09 02:28:23
【问题描述】:
在我的应用程序中,我有一个字段供用户输入全名,但我需要防止用户在文本字段中输入任何数字和表情符号。任何想法如何做到这一点?
同时,我不能使用 ASCII 键盘,因为用户必须能够输入不同的语言。
【问题讨论】:
标签: ios objective-c regex validation nsstring
在我的应用程序中,我有一个字段供用户输入全名,但我需要防止用户在文本字段中输入任何数字和表情符号。任何想法如何做到这一点?
同时,我不能使用 ASCII 键盘,因为用户必须能够输入不同的语言。
【问题讨论】:
标签: ios objective-c regex validation nsstring
已经提到的委托函数的更好(IMO)和更简洁的实现:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
return [string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location == NSNotFound);
}
这会从除了数字 0-9 之外的每个可能的字符创建一个字符集,然后在字符串中查找它们中的任何一个。此解决方案正确处理用户使用删除键时发送的空字符串。
如果您想允许其他人使用标点符号,您可以使用 NSMutableCharacterSet 或使用 NSCharacterSet 方法创建自己的字符集
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"0123456789,.-"];
代替decimalDigitCharacterSet
【讨论】:
您指定了field,但没有给出更精确的信息,所以我假设我们在这里讨论的是UITextField,因为其他控件将遵循相同的逻辑:
您首先应该为您的UITextField 设计一个委托,假设它将是当前的视图控制器:
#import <UIKit/UIKit.h>
@interface _4644493ViewController : UIViewController<UITextFieldDelegate>
@end
然后,在你的 viewController.m 中,你应该在接受字符之前检查键盘上按下的值是否是一个接受的字符(让我们在这个例子中尝试使用数字):
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string isEqual:@"1"] || [string isEqual:@"2"] || [string isEqual:@"3"] || [string isEqual:@"4"] || [string isEqual:@"5"] || [string isEqual:@"6"] || [string isEqual:@"7"] || [string isEqual:@"8"] || [string isEqual:@"9"]) {
return NO;
}
return YES;
}
另外,别忘了设计你的UITextField的代表,例如:
UITextField *test = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 200, 30)];
[test.layer setBorderColor:[UIColor blackColor].CGColor];
[test.layer setBorderWidth:2.0];
test.delegate = self;
[self.view addSubview:test];
【讨论】:
string 只包含来自letterCharacterSet NSCharacterSet 的字符?虽然您也需要允许一些标点符号,因为许多名称都有一些标点符号。