2017-04-26 21 views
2

我有一個textfield,我想在這上面輸入的格式文本: AA #### 1234 我知道這應該shouldChangeCharactersInRange委託方法來實現textfield .nut我無法理解每個角色的狀態將如何實施。請給予您的建議。提前感謝!的TextField.text進入應該有特定的格式

+1

顯示您的嘗試代碼 –

回答

0

,可以有助於驗證您的需求的表達可能是:

^[a-z]{2}\s\d{4}\s\d{4}$ 

這裏:

  • ^ - 顯示字符串
  • [a-z]{2}的開始 - 顯示A-Z之間的任何字符恰好2倍
  • \s - 顯示空白字符一次。
  • \d{4} - 顯示0-9的任何數字,正好4次。
  • $ - 顯示字符串

末作爲一種解決方法的一個例子可能是這樣,這裏的棘手的部分是讓施工串下:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSError *error = NULL; 
    NSRegularExpression *regex = nil; 

    NSMutableString *combinedText = [textField.text mutableCopy]; 
    [combinedText replaceCharactersInRange:range withString:string]; 

    switch (combinedText.length) { 
     case 1: 
     case 2: 
      regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"^[a-z]{%ld}", (long)combinedText.length] options:NSRegularExpressionCaseInsensitive error:&error]; 
      break; 
     case 3: 
      regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-z]{2}\\s" options:NSRegularExpressionCaseInsensitive error:&error]; 
      break; 
     case 4: 
     case 5: 
     case 6: 
     case 7: 
      regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"^[a-z]{2}\\s\\d{%ld}", (long)combinedText.length - 3] options:NSRegularExpressionCaseInsensitive error:&error]; 
      break; 
     case 8: 
      regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-z]{2}\\s\\d{4}\\s" options:NSRegularExpressionCaseInsensitive error:&error]; 
      break; 
     case 9: 
     case 10: 
     case 11: 
     case 12: 
      regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"^[a-z]{2}\\s\\d{4}\\s\\d{%ld}$", (long)combinedText.length - 8] options:NSRegularExpressionCaseInsensitive error:&error]; 
      break; 
     default: 
      return false; 
    } 

    if(error) return false;   

    NSUInteger numberOfMatches = [regex numberOfMatchesInString:combinedText options:0 range:NSMakeRange(0, combinedText.length)]; 
    return numberOfMatches > 0 || string.length == 0; 
} 

希望幫助!

+0

@Prez,我剛剛檢查了您的問題內容已更改。無論如何,很高興看到你做到了。 – NeverHopeless

+0

謝謝先生......我已經完成了全部工作,但無法理解爲什麼它會在退格時崩潰。請給我提供一些指導嗎? – Prez

+0

我的當前解決方案支持'||的幫助退格處理string.length == 0'和'range:NSMakeRange(0,combinedText.length)'。你的代碼中是否也有這個? – NeverHopeless

0

在UITextField上創建類別並根據您的要求添加此方法寫入條件。下面的例子電子郵件ID:

- (BOOL)validateRegEx:(NSString*)regexString 
{ 
    NSError *error = NULL; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString 
                     options:NSRegularExpressionCaseInsensitive 
                     error:&error]; 
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:self.text 
                options:0 
                 range:NSMakeRange(0, [self.text length])]; 

    return numberOfMatches > 0; 
} 
+0

你能幫助我在這裏需要實現的正則表達式嗎? – Prez

0

試試這個

-(BOOL)checkString:(NSString *)str{ 
    NSString *regex1 = @"^[a-bA-B0-9]"; // chabge regex as per your needs 
    NSPredicate *test1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex1]; 
    return [test1 evaluateWithObject:str] ; 
} 
+0

你能幫助我在這裏需要實現的正則表達式嗎? – Prez

+0

當然。等我在這裏更新。 – KKRocks