【问题标题】:how to make TextField validations start with 10 number and end with 99 in Ios如何在 Ios 中使 TextField 验证以 10 数字开头并以 99 结尾
【发布时间】:2023-03-07 14:58:01
【问题描述】:

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

我的医疗补助必须只允许数字和 medicaId 以 10 开头并以 99 结尾,如果不是,那么我想显示警报 Invalid 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];
    }

}

【问题讨论】:

  • 使用regular expression
  • 请用代码@luk2302解释一下
  • 请显示一些确切允许输入的示例和一些应该拒绝的输入,我还没有完全理解您的要求
  • @luk2302 很可能,因为正则表达式没有任何帮助
  • 我的要求是我希望文本字段只允许“数字”并且它必须以 10 开头并以 99 结束

标签: ios objective-c uitextfield


【解决方案1】:

您可以从文本字段中获取字符串并使用 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;
    }        
}

【讨论】:

  • 我很初学者 Apurv 请用一些代码解释我
  • @AbhiRam 打开 NSString 的文档并查找给定的方法,它们几乎是不言自明的。
  • @AbhiRam 我写了伪代码。这应该会给你一些想法。
  • 如何找到文本文件输入的数字位置(如12345如何在NSLog语句中打印第4个数字位置?)
【解决方案2】:

一般来说,使用regular expressions 可以轻松解决这类约束。它们允许您轻松地在给定的输入字符串上指定相当复杂的约束。 (只要你不想数)。看看 here 了解如何在 Objective-C 中使用正则表达式。

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

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

想象一下用户开始打字

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

如果您确实拒绝无效输入,则用户将永远无法获得有效输入,因为起点总是无效的。

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

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

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

【讨论】:

    【解决方案3】:

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

    A.数字格式化程序

    您应该阅读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,返回YES
    • 值不正确,您不能或不想将其转换为正确值:返回NO

    C.使用

    您在处理输入接管的任何地方都使用您的验证方法。简单地说:

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

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

    顺便说一句:

    #define ACCEPTABLE_CHARECTERS @"0123456789."
    #define MAX_LENGTH 5
    

    ……真的不是什么好风格。但这是另一个问题。也许你至少应该看看NSCharacterSet

    【讨论】:

      【解决方案4】:

      我的回答完美。

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

      【讨论】:

      • 非常感谢欢迎 AbhiRam:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2021-08-26
      • 2020-07-17
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多