如何使TextField验证以10号开头,以Ios结束99

时间:2015-12-11 08:49:07

标签: ios objective-c uitextfield

您好我是Ios的初学者,在我的项目登录页面中有文本字段验证(这里我有两个文本字段,它们是medicaId,密码)

我的医疗设备必须只允许数字和药物以10开头,如果不是则以99结束我想要显示提醒无效的医疗

但是根据我的经验,我能够做到只有textfield允许数字,但我不明白该怎么做那个textfield(我的医疗补助)从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];
    }

}

4 个答案:

答案 0 :(得分:1)

我的回答很完美。

- (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

答案 1 :(得分:0)

您可以从文本字段中获取字符串,并使用set操作检查它是否仅包含数字。

然后使用像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;
    }        
}

答案 2 :(得分:0)

通常,使用regular expressions可以轻松解决这些约束。它们允许您轻松地为给定的输入字符串指定非常复杂的约束。 (只要你不想算)。看看如何在Objective-C中使用正则表达式here

但是你需要处理的情况略有不同:用户不会立即输入整个字符串 - 他会输入字符后的字符。在用户输入期间检查几乎是不可能的,不管他最终会得到什么可能是有效的输入。例如,当用户键入前几个字符时,将不会有前导99。你当然可以阻止他输入除数字以外的任何其他内容,因为它们在整个输入中的任何地方都不会是有效字符。

如果您在shouldChangeCharactersInRange内实施整个验证,那么您将度过糟糕的一天:

想象一下用户开始输入

  

1 - 不以10开头且不以99结尾 - >拒绝
  10 - 不以99结尾 - >拒绝
  102 - 不以99结尾 - >拒绝
  1029 - 不以99结尾 - >拒绝
  10299 - 批准
  1299 - 不再以10开头 - >拒绝

如果您实际拒绝无效输入,则用户永远无法获得有效输入,因为起始点始终无效。

您所能做的就是执行检查并通知用户输入无效 - 但您不能拒绝输入。 (您可以显示感叹号,更改字体颜色等)

正如@Apurv写的,在你的"简单"您可能甚至不需要使用正则表达式但可以使用基本字符串操作的情况。但是上述关于在输入过程中不拒绝用户输入的陈述仍然是正确的。

上面严格声明的一个细微变化是你实际上可以拒绝任何非数字字符,因为它们总是会创建无效的输入。

答案 3 :(得分:0)

您应该真正使用Cocoa的核心技术,而不是处理手工制作的方法。

一个。数字格式化程序

您应该阅读introduction to number formattersNSNumberFormatter的实例支持具有最小值和最大值的范围。而且,他们将字符串转换为数字并返回。

B中。键 - 值验证

价值验证的预期概念是key-value validation。你应该总是实现这个而不是定制的方法。 (例如,你得到的好处是,Cocoa中的技术在进行自己的验证时会使用这种方法。)

仅允许数字后,您只需过滤掉非法值。在你的情况下,它将是:

-(BOOL)validateYourPropertyNameHere:(id *)ioValue error:(NSError * __autoreleasing *)outError {
  // Do some checking, i. e. …

}

输入Safari。

这有点棘手,因为你有三个选择:

  • 值正确:只需返回YES
  • 值不正确,但可以转换为正确的值(即输入为103,并且您希望将其转换为99):创建新对象并将引用分配给ioValue,返回{{1 }}。
  • 该值不正确,您不能或不想将其转换为正确的值:return YES

℃。使用

您可以在处理接收输入的任何地方使用验证方法。简单地:

NO

如果您有更多问题,请随时添加评论。

顺便说一句:

NSError *error;
if( [self validateYourPropertyNameHere:&userInput error:&error] == NO )
{
  // Display error or whatever
}
else 
{
  // Use value
}

......真的不是好风格。但这是另一个问题。也许你至少应该看看#define ACCEPTABLE_CHARECTERS @"0123456789." #define MAX_LENGTH 5