【问题标题】:Allowing only alphabets in textField仅允许在 textField 中使用字母
【发布时间】:2013-01-16 12:18:29
【问题描述】:

我想让 UITextField 只接受字符并在输入数字或特殊字符时显示错误。但是当我这样做时,当我输入字母时也会显示错误。不明白我哪里出错了?

NSString *FNameReg=@"[A-Za-z]";
NSPredicate *FNametest=[NSPredicate predicateWithFormat:@"SELF MATCHES %@",FNameReg];
 if(![FNametest evaluateWithObject:txtfirstname.text])
    {
        lblvalidateFName.hidden=NO;
        [testScroll setContentOffset:CGPointMake( 0 , 74)];
        return;
    }

但是现在当我给出字母表时也会显示错误。是这样吗?

【问题讨论】:

  • 您的代码是正确的。可能有其他错误导致错误。

标签: iphone uitextfield xcode4.5


【解决方案1】:

创建一种验证方法,如下所示:

-(BOOL) validateAlphabets: (NSString *)alpha
{
NSString *abnRegex = @"[A-Za-z]+"; // check for one or more occurrence of string you can also use * instead + for ignoring null value 
NSPredicate *abnTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", abnRegex];
BOOL isValid = [abnTest evaluateWithObject:alpha];
return isValid;
}

现在像这样检查您想要的验证:

bool checkAlphabets = [self validateAlphabets:txtfirstname.text];

if(!checkAlphabets)
{
   NSLog(@"Not Matches..");
}
else
{
  NSLog(@"Matches..");
}

【讨论】:

    【解决方案2】:

    您可以使用以下代码验证字母字符串。

    使用NSPredicate

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    
        return [self validateStringWithAlphabet:string]; 
    }
    
    - (BOOL)validateStringWithAlphabet:(NSString *)string {
        NSString *stringRegex = @"[A-Za-z]";
        NSPredicate *stringPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stringRegex];
    
        return [stringPredicate evaluateWithObject:string]; 
    }
    

    使用NSCharacterSet

    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
     {
            if(textField == yourTextField)
            {
                NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"] invertedSet];
                NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
                return [string isEqualToString:filtered];
            }
    
            return YES;
     }
    

    【讨论】:

    • 但是我的代码有什么问题。它在其他情况下也可以工作。我在按钮点击事件中检查它
    • 如果出现数字或特殊字符,那么我已经显示了一个标签“仅输入字母”。所以在我的情况下,如果我给字母也输入 if loop
    • 此代码只允许显示数字!您需要删除一个“invertedSet]”才能只显示字母。
    【解决方案3】:

    如果您只想允许使用字母,请尝试下面的代码我的朋友。

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    {
    
       NSCharacterSet *nonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"] invertedSet];
    
       NSString *trimmedReplacement = [[ text componentsSeparatedByCharactersInSet: nonNumberSet] componentsJoinedByString:@""];
    
       return ([text stringByTrimmingCharactersInSet:nonNumberSet].length > 0); 
    
    }
    

    让我知道它是否有效!!!!

    编码愉快!!!!!!

    【讨论】:

      【解决方案4】:
      -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
      
      NSCharacterSet *blockedCharacters = [[NSCharacterSet whitespaceCharacterSet] invertedSet]; NSCharacterSet *blockedCharacters2 = [[NSCharacterSet letterCharacterSet]invertedSet]; 
      
      if([string rangeOfCharacterFromSet:blockedCharacters].location == NSNotFound || [string rangeOfCharacterFromSet:blockedCharacters2].location)
      {
      
       // enter your alert 
      [alert show];
      }
      return ([string rangeOfCharacterFromSet:blockedCharacters].location == NSNotFound || [string rangeOfCharacterFromSet:blockedCharacters2].location) ;
      
      }
      

      【讨论】:

        【解决方案5】:
        Check this out . First if block for backspace , next if to allow only letters , next if to allow only numbers.
        
          - (BOOL)textField:(UITextField *)field shouldChangeCharactersInRange:(NSRange)range       replacementString:(NSString *)characters
         {
        NSCharacterSet *blockedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet] ;
        NSCharacterSet *letters = [NSCharacterSet letterCharacterSet]  ;
        NSCharacterSet *numbers = [NSCharacterSet decimalDigitCharacterSet]  ;
        
        NSLog(@"%@",[blockedCharacters description]);
        
        //for allowing backspace.
        if([characters isEqualToString:@""])
        {
            return true;
        }
        if(field==self.firstNameTextField || field==self.lastNameTextField || field==self.addrLocalityTextField || field==self.addrRegionField){
        
        
            if([characters rangeOfCharacterFromSet:letters].location) {
                [self shakeWithIterations:0 direction:1 size:4 view:field];
        
                return false;
            }
        }
        
        if(field==self.addrPostalCodeTextField || field==self.accountNumTextField || field==self.routingNumTextField ){
        
            if( field==self.addrPostalCodeTextField ){
            NSUInteger newLength = [addrPostalCodeTextField.text length] + [characters length] - range.length;
            return (newLength > 5) ? NO : YES;
            }
            if([characters rangeOfCharacterFromSet:numbers].location) {
                [self shakeWithIterations:0 direction:1 size:4 view:field];
                return false;
            }
        }
         return true;}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-13
          • 1970-01-01
          相关资源
          最近更新 更多