Ios 如何使 TextField 验证以 10 数字开始并以 99 结束
how to make TextField validations start with 10 number and end with 99 in Ios
嗨,我是 Ios 的初学者,在我的项目登录页面中有文本字段验证(这里我有两个文本字段,它们是 medicaId、密码)
我的 medicaid 必须只允许数字并且 medicaId 以 10 开头并以 99 结尾,如果不是,那么我想显示警报无效的 medicaId
但根据我的经验,我只能做文本字段允许数字,但我不明白如何做文本字段(我的医疗补助)以 10 开头并以 99 结尾请帮我一个
我的代码:-
#import "ViewController.h"
@interface ViewController ()
#define ACCEPTABLE_CHARECTERS @"0123456789"
@end
@implementation ViewController
@synthesize textfield;
- (void)viewDidLoad {
[super viewDidLoad];
textfield.delegate = self;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (textField==textfield)
{
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARECTERS] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
return YES;
}
-(IBAction)CickMe:(id)sender{
if (success) {
NSLog(@"validations are perfect");
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"MedicaId must starts with 10 and ends with 99" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Cancel", nil];
[alert show];
}
}
您可以从文本字段中获取字符串并使用设置操作检查它是否仅包含数字。
然后使用像hasPrefix和hasSuffix这样的NSString函数来检查它是否在开始或结束时有特定的值。
-(void) validate
{
BOOL isSuccess = FALSE;
NSString *input = textField.text;
if(input.length > 4)
{
if([input hasPrefix:@"10"] && [input hasSuffix:@"99"])
isSuccess = TRUE;
}
}
一般来说,使用 regular expressions
可以很容易地解决这类约束。它们允许您轻松地在给定的输入字符串上指定相当复杂的约束。 (只要你不想算)。查看 here 如何在 Objective-C.
中使用正则表达式
但是你必须处理的情况略有不同:用户不会一次输入 整个 字符串 - 他将一个接一个地输入字符。在用户输入期间几乎不可能检查他将要结束的内容是否可能是有效输入。例如,当用户输入前几个字符时,不会有前导 99
。你当然可以阻止他输入除数字以外的任何其他内容,因为它们在整个输入中的任何地方都永远不会是有效字符。
如果您在 shouldChangeCharactersInRange
中实施整个验证,您将度过糟糕的一天:
假设用户开始输入
1 - does not start with 10 and does not end with 99 -> reject
10 - does not end with 99 -> reject
102 - does not end with 99 -> reject
1029 - does not end with 99 -> reject
10299 - approve
1299 - does no longer start with 10 -> reject
如果您真的拒绝无效输入,用户将永远无法获得有效输入,因为起点始终无效。
您所能做的就是执行检查并通知用户输入无效 - 但您不能拒绝输入。 (可以显示感叹号,更改字体颜色等)
正如@Apurv 所写,在您的 "simple" 情况下,您可能甚至不需要使用正则表达式,但可以使用基本的字符串操作。但上述关于在输入过程中不拒绝用户输入的说法仍然成立。
上述严格声明的一个细微变化是您实际上可以拒绝任何非数字字符,因为它们总是会创建无效输入。
与其处理手工制作的方法,不如真正使用Cocoa的核心技术。
一个。数字格式化程序
您应该阅读 introduction to number formatters. Instances of NSNumberFormatter
支持具有最小值和最大值的范围。此外,他们将字符串转换为数字并返回。
乙。键值验证
值验证的预期概念是 key-value validation。你应该总是实现这个而不是定制的方法。 (也就是说,你得到了好处,Cocoa 中的技术在进行自己的验证时使用了这种方法。)
仅允许数字后,您只需过滤掉非法值即可。在你的情况下它将是:
-(BOOL)validateYourPropertyNameHere:(id *)ioValue error:(NSError * __autoreleasing *)outError {
// Do some checking, i. e. …
}
在 Safari 中输入。
这有点棘手,因为你有三个选择:
- 值正确:只需 return
YES
.
- 值不正确,但可以转换为正确的值(即输入为103,您想将其转换为99):创建一个新对象并将引用赋值给
ioValue
,return YES
.
- 该值不正确,您不能或不想将其转换为正确的值:return
NO
.
C。使用
您在处理输入接管的任何地方都使用您的验证方法。简单地:
NSError *error;
if( [self validateYourPropertyNameHere:&userInput error:&error] == NO )
{
// Display error or whatever
}
else
{
// Use value
}
如果您有更多问题,请随时添加评论。
顺便说一句:
#define ACCEPTABLE_CHARECTERS @"0123456789."
#define MAX_LENGTH 5
…真是没啥好作风的。但这是另一个问题。也许你至少应该看看NSCharacterSet
。
我的回答很完美。
- (IBAction)ClickMe:(id)sender
{
NSString *strID = textFieldUserID.text;
NSString *strLastTwoIndex = [strID substringFromIndex: [strID length] - 2];
NSLog(@"The strJoinedStr is - %@",strLastTwoIndex);
if([strID hasPrefix:@"10"] && [strLastTwoIndex isEqualToString:@"99"])
{
NSLog(@"Success");
}
else{
NSLog(@"Failure");
}
}
控制台输出为
Success
嗨,我是 Ios 的初学者,在我的项目登录页面中有文本字段验证(这里我有两个文本字段,它们是 medicaId、密码)
我的 medicaid 必须只允许数字并且 medicaId 以 10 开头并以 99 结尾,如果不是,那么我想显示警报无效的 medicaId
但根据我的经验,我只能做文本字段允许数字,但我不明白如何做文本字段(我的医疗补助)以 10 开头并以 99 结尾请帮我一个
我的代码:-
#import "ViewController.h"
@interface ViewController ()
#define ACCEPTABLE_CHARECTERS @"0123456789"
@end
@implementation ViewController
@synthesize textfield;
- (void)viewDidLoad {
[super viewDidLoad];
textfield.delegate = self;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (textField==textfield)
{
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARECTERS] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
return YES;
}
-(IBAction)CickMe:(id)sender{
if (success) {
NSLog(@"validations are perfect");
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"MedicaId must starts with 10 and ends with 99" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Cancel", nil];
[alert show];
}
}
您可以从文本字段中获取字符串并使用设置操作检查它是否仅包含数字。
然后使用像hasPrefix和hasSuffix这样的NSString函数来检查它是否在开始或结束时有特定的值。
-(void) validate
{
BOOL isSuccess = FALSE;
NSString *input = textField.text;
if(input.length > 4)
{
if([input hasPrefix:@"10"] && [input hasSuffix:@"99"])
isSuccess = TRUE;
}
}
一般来说,使用 regular expressions
可以很容易地解决这类约束。它们允许您轻松地在给定的输入字符串上指定相当复杂的约束。 (只要你不想算)。查看 here 如何在 Objective-C.
但是你必须处理的情况略有不同:用户不会一次输入 整个 字符串 - 他将一个接一个地输入字符。在用户输入期间几乎不可能检查他将要结束的内容是否可能是有效输入。例如,当用户输入前几个字符时,不会有前导 99
。你当然可以阻止他输入除数字以外的任何其他内容,因为它们在整个输入中的任何地方都永远不会是有效字符。
如果您在 shouldChangeCharactersInRange
中实施整个验证,您将度过糟糕的一天:
假设用户开始输入
1 - does not start with 10 and does not end with 99 -> reject
10 - does not end with 99 -> reject
102 - does not end with 99 -> reject
1029 - does not end with 99 -> reject
10299 - approve
1299 - does no longer start with 10 -> reject
如果您真的拒绝无效输入,用户将永远无法获得有效输入,因为起点始终无效。
您所能做的就是执行检查并通知用户输入无效 - 但您不能拒绝输入。 (可以显示感叹号,更改字体颜色等)
正如@Apurv 所写,在您的 "simple" 情况下,您可能甚至不需要使用正则表达式,但可以使用基本的字符串操作。但上述关于在输入过程中不拒绝用户输入的说法仍然成立。
上述严格声明的一个细微变化是您实际上可以拒绝任何非数字字符,因为它们总是会创建无效输入。
与其处理手工制作的方法,不如真正使用Cocoa的核心技术。
一个。数字格式化程序
您应该阅读 introduction to number formatters. Instances of NSNumberFormatter
支持具有最小值和最大值的范围。此外,他们将字符串转换为数字并返回。
乙。键值验证
值验证的预期概念是 key-value validation。你应该总是实现这个而不是定制的方法。 (也就是说,你得到了好处,Cocoa 中的技术在进行自己的验证时使用了这种方法。)
仅允许数字后,您只需过滤掉非法值即可。在你的情况下它将是:
-(BOOL)validateYourPropertyNameHere:(id *)ioValue error:(NSError * __autoreleasing *)outError {
// Do some checking, i. e. …
}
在 Safari 中输入。
这有点棘手,因为你有三个选择:
- 值正确:只需 return
YES
. - 值不正确,但可以转换为正确的值(即输入为103,您想将其转换为99):创建一个新对象并将引用赋值给
ioValue
,returnYES
. - 该值不正确,您不能或不想将其转换为正确的值:return
NO
.
C。使用
您在处理输入接管的任何地方都使用您的验证方法。简单地:
NSError *error;
if( [self validateYourPropertyNameHere:&userInput error:&error] == NO )
{
// Display error or whatever
}
else
{
// Use value
}
如果您有更多问题,请随时添加评论。
顺便说一句:
#define ACCEPTABLE_CHARECTERS @"0123456789."
#define MAX_LENGTH 5
…真是没啥好作风的。但这是另一个问题。也许你至少应该看看NSCharacterSet
。
我的回答很完美。
- (IBAction)ClickMe:(id)sender
{
NSString *strID = textFieldUserID.text;
NSString *strLastTwoIndex = [strID substringFromIndex: [strID length] - 2];
NSLog(@"The strJoinedStr is - %@",strLastTwoIndex);
if([strID hasPrefix:@"10"] && [strLastTwoIndex isEqualToString:@"99"])
{
NSLog(@"Success");
}
else{
NSLog(@"Failure");
}
}
控制台输出为
Success