我不确定您希望如何处理用户输入和反馈。首先,我将展示一种简单的方法来保持用户在编辑模式下的文本字段中,如果其输入无效。
首先是两个委托方法:
- (BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
[aTextField resignFirstResponder];
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)aTextField
{
return [self validateInputWithString:aTextField.text];
}
这个测试方法只返回YES或NO,判断输入是否有效:
- (BOOL)validateInputWithString:(NSString *)aString
{
NSString * const regularExpression = @"^([+-]{1})([0-9]{3})$";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regularExpression
options:NSRegularExpressionCaseInsensitive
error:&error];
if (error) {
NSLog(@"error %@", error);
}
NSUInteger numberOfMatches = [regex numberOfMatchesInString:aString
options:0
range:NSMakeRange(0, [aString length])];
return numberOfMatches > 0;
}
就是这样。但我建议向用户显示一些实时状态,以说明他的输入是否正确。例如,在您的viewDidLoad方法中添加以下通知:
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(validateInputCallback:)
name:@"UITextFieldTextDidChangeNotification"
object:nil];
}
- (void)validateInputCallback:(id)sender
{
if ([self validateInputWithString:textField.text]) {
} else {
}
}
最后: 如果需要访问正则表达式的捕获组(+或-和数字),以下代码将有所帮助:
NSArray *matches = [regex matchesInString:aString
options:0
range:NSMakeRange(0, [aString length])];
for (NSTextCheckingResult *match in matches) {
for (int i = 0; i < [match numberOfRanges]; i++) {
NSLog(@"range %d: %d %d", i, [match rangeAtIndex:i].location, [match rangeAtIndex:i].length);
NSLog(@"substring %d: %@", i, [aString substringWithRange:[match rangeAtIndex:i]]);
}
}