【问题标题】:set multiple validation on textField in ios在 ios 中的 textField 上设置多个验证
【发布时间】:2015-01-09 13:10:56
【问题描述】:

我正在开发 iOS 中的一个应用程序,在该应用程序中我在页面上使用多个文本字段,并且我必须为 textField 设置不同的验证。假设对于一个文本字段,我只想允许输入字符,而对于一个我只想输入数字的文本字段。我该怎么做。任何建议! 我使用了下面的代码,但它只适用于第一个文本字段。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range      replacementString:(NSString *)string
{
if (!string.length) 
    return YES;

if (textField == self.tmpTextField)
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$";
    NSRegularExpression *regex = [NSRegularExpressionregularExpressionWithPattern:expression 
                                                                           options:NSRegularExpressionCaseInsensitive 
                                                                             error:nil];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
                                                        options:0
                                                          range:NSMakeRange(0, [newString length])];        
    if (numberOfMatches == 0)
        return NO;        
}
return YES;
}

【问题讨论】:

  • 第二个文本字段的名称是什么。
  • 如何使用keyboardType 限制文本字段中的文本输入?
  • Hey Utkarsh 键盘类型只是在编辑文本字段时将特定键盘打开为小数键盘、数字键盘和字符键盘。要停止在文本字段中键入字符,您需要对其进行限制。我在答案中给出了一个代码,一旦您检查,我如何停止 textField 以停止输入字符.....谢谢
  • n00bProgrammer,keyboardType 可以在 iPhone 和 iPad 平台之间有所不同,用户也可以将文本粘贴到 textField 中。

标签: ios objective-c iphone uitextfield


【解决方案1】:
#define ACCEPTABLE_CHARACTERS @"0123456789"

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

if ([textField isEqual:zipCode]) {

    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return [string isEqualToString:filtered];


}

return YES;

}

【讨论】:

    【解决方案2】:

    使用文本字段的 TAG 属性,然后将其区分如下。

    ex. set property like this.
    
        textfielfname.tag =0;
        textfielfemail.tag =1;
    
        if(textField.tag == 0)
        {
           NSLog(@"First text field");
        }
         else{
               NSLog(@"Second text field");
             }
    

    【讨论】:

      【解决方案3】:

      我假设 textFiel 到只有文本是:self.tmpTextField,如果不在此代码中更改它:

       -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
      {
      NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$";
      NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression
                                                                            options:NSRegularExpressionCaseInsensitive
                                                                              error:nil];
      NSUInteger numberOfMatches = [regex numberOfMatchesInString:string
                                                          options:0
                                                            range:NSMakeRange(0, [string length])];
      
      if (numberOfMatches == 0)
      {
          if (textField == self.tmpTextField)
          {
              return YES;
          } else {
              return NO;
          }
      }
      else
      {
      
          if (textField == self.tmpTextField)
          {
              return NO;
          }
          else
          {
              return YES;
          }
      }
      }
      

      【讨论】:

      • 您好 Onik,感谢您的建议。但是这段代码不允许我在第一个文本字段和第二个文本字段中输入任何内容,允许我同时输入字符和数字。我的问题仍然存在!
      • 您好 Onik,您可以假设我的第一个文本字段是名称,仅包含字符,第二个文本字段是数字,仅包含 0-9 之间的数字
      • @sumitkapoor 嗨,我更新了我的代码并测试了它(昨天我没有电脑)。如果您的 textField 到文本的工作正常:self.tmpTextField.
      • 别忘了放两个代表。
      • 嘿 Onik 我昨晚解决了我的问题,它对我来说非常简单,感谢您的代码。我回答了这个问题和代码,一旦您检查......
      【解决方案4】:

      UITextField(和 UITextView,就此而言)的所有委托方法都包含指向相关文本字段的指针。

      您可以将单独的对象设置为每个文本字段的委托,也可以编写委托方法,根据传递给委托方法的文本字段来运行不同的代码。我发现设置单独的对象作为每个文本字段的代表通常比它的价值更麻烦。

      要编写处理所有文本字段的委托方法,只需为每个文本字段设置出口即可。然后,您可以使用 switch 语句或 if 语句基于字段进行分支。 (switch 语句有效,因为 Objective C 中的对象指针是指针,它是一种标量类型。不过,您可能必须将其强制转换为无符号长整数以避免编译器的抱怨。

      在您的标题中:

      IBOutlet UITextField *textField1;
      IBOutlet UITextField *textField2;
      IBOutlet UITextField *textField3;
      

      您可以分别在 Storyboard 0,1 和 2 中设置标签。

      如果你想以编程方式设置它,那么

      textField1.tag = 0;
      textField2.tag = 1;
      textField3.tag = 2;
      

      在您的 .m 文件中:

      - (BOOL)textField: (UITextField *) textField 
          shouldChangeCharactersInRange: (NSRange) range      
          replacementString: (NSString *) string
      {
        switch (textField.tag)
        {
          case 0:
            //Code for textField1
            break;
          case 1:
            //Code for textField2
            break;
          case 2:
            //Code for textField3
            break;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-22
        • 1970-01-01
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多