2013-01-16 63 views
2

我想讓UITextField只接受字符並在輸入數字或特殊字符時顯示錯誤。但是當我這樣做時,當我輸入字母時也顯示錯誤。不能理解我要去哪裏錯誤?只允許textField中的字母

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

現在,當我給字母表也是錯誤顯示.Y是這樣嗎?

+0

你的代碼是正確的。可能有其他錯誤導致錯誤。 –

回答

6

您可以使用下面的代碼驗證字母表字符串。

使用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; 
} 
+0

但是我的代碼有什麼問題。它在其他情況下工作。我在按鈕單擊事件中檢查它 – Honey

+0

當你使用你的代碼時得到了什麼?意味着任何錯誤? –

+0

如果出現數字或特殊字符,那麼我已經顯示了一個標籤「僅輸入字母」。因此,在我的情況下,如果我輸入字母也會輸入循環 – Honey

2

試試下面的代碼我的朋友,如果你想只允許字母。

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

} 

讓我知道它工作與否!

快樂編碼!!!!!

+0

它與@Paras Joshi答覆哥哥一樣.. –

8

像這樣創建用於驗證的一個方法:

-(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.."); 
} 
+0

感謝哥們:) – Abo3atef

1
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;} 
2
-(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) ; 

}