在輸入框中輸入手機號碼/電話號碼/銀行卡號/身份證號時常常須要格式化顯示, 用戶體驗更好.數組
網上解決方法不少,找了很多但也是不太適合,因而把其中一些修改爲如下方法, 在UITextField
的分類中添加過濾,浸入性小,耦合性小,用起來仍是很方便的.間隔符號能夠自定義,過濾條件也能夠本身增長和修改, 如只能輸入數字和X(身份證號)等限制.ui
直接上代碼: atom
UITextField
的分類:spa
UITextField+Extension.hcode
#import <UIKit/UIKit.h> // 准許輸入字符類型 typedef NS_ENUM(NSInteger, CharsType) { CharsType_numeral = 1, // 只許數字 CharsType_letter, // 只許大小寫字母 CharsType_numeralAndXx, // 只許數字加上X和x CharsType_numeralAndLetter, // 只許數字加上大小寫字母 CharsType_allChar, // 容許輸入全部字符 }; @interface UITextField (Extension) /** * 格式化輸入的文字 * * @param textField 正在輸入的textField * @param range 輸入字符的位置 * @param string 輸入的字符 * @param CharType 准許輸入字符類型 * @param maxLength 限制輸入文字的最大長度 * @param indexs 插入分隔符的位置下標數組 * @param separator 插入的分隔符號 * * @return 是否加顯示到textField輸入框內 */ + (BOOL)textField:(UITextField *)textField range:(NSRange)range string:(NSString *)string CharType:(CharsType)CharType maxLength:(NSInteger)maxLength separatorIndexs:(NSArray *)indexs separator:(NSString *)separator; @end
UITextField+Extension.mci
#import "UITextField+Extension.h" @implementation UITextField (Extension) + (BOOL)textField:(UITextField *)textField range:(NSRange)range string:(NSString *)string CharType:(CharsType)CharType maxLength:(NSInteger)maxLength separatorIndexs:(NSArray *)indexs separator:(NSString *)separator { if ([string isEqualToString:separator]) return NO; // 添加限制條件,只能輸入這個字符串內的字符 NSString *allowChar; switch (CharType) { case CharsType_numeral: allowChar = @"0123456789\b"; break; case CharsType_letter: allowChar = @"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM\b"; break; case CharsType_numeralAndXx: allowChar = @"0123456789Xx\b"; break; case CharsType_numeralAndLetter: allowChar = @"0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM\b"; break; default: break; } NSCharacterSet *characterSet; if (CharType != CharsType_allChar) { characterSet = [NSCharacterSet characterSetWithCharactersInString:allowChar]; string = [string stringByReplacingOccurrencesOfString:separator withString:@""]; if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) { return NO; } } NSString *text = textField.text; if ([string isEqualToString:@""]){ if (range.length == 1) { if (range.location == text.length - 1) { if ([[text substringFromIndex:text.length -1] isEqualToString:separator]) { [textField deleteBackward]; } return YES; } else { NSInteger offset = range.location; if (range.location < text.length && [[text substringFromIndex:range.location] isEqualToString:separator] && [textField.selectedTextRange isEmpty]) { [textField deleteBackward]; offset --; } [textField deleteBackward]; textField.text = [self parseString:textField.text separatorIndexs:indexs separator:separator]; UITextPosition *newPos = [textField positionFromPosition:textField.beginningOfDocument offset:offset]; textField.selectedTextRange = [textField textRangeFromPosition:newPos toPosition:newPos]; return NO; } } else if (range.length > 1) { BOOL isLast = NO; if(range.location + range.length == textField.text.length ){ isLast = YES; } [textField deleteBackward]; textField.text = [self parseString:textField.text separatorIndexs:indexs separator:separator]; __block NSInteger offset = range.location; [indexs enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSInteger index = [obj integerValue]; if (range.location == index) offset++; }]; if (isLast) { } else { UITextPosition *newPos = [textField positionFromPosition:textField.beginningOfDocument offset:offset]; textField.selectedTextRange = [textField textRangeFromPosition:newPos toPosition:newPos]; } return NO; } else { return YES; } } else if (string.length > 0) { NSString *str; if (CharType != CharsType_allChar) { str = [textField.text stringByTrimmingCharactersInSet:[characterSet invertedSet]]; } str = [textField.text stringByReplacingOccurrencesOfString:separator withString:@""]; if ((str.length + string.length - range.length > maxLength) ) { return NO; } [textField insertText:string]; textField.text = [self parseString:textField.text separatorIndexs:indexs separator:separator]; __block NSInteger offset = range.location + string.length; [indexs enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSInteger index = [obj integerValue]; if (range.location == index) offset++; }]; UITextPosition *newPos = [textField positionFromPosition:textField.beginningOfDocument offset:offset]; textField.selectedTextRange = [textField textRangeFromPosition:newPos toPosition:newPos]; return NO; } else { return YES; } } + (NSString *)parseString:(NSString*)string separatorIndexs:(NSArray *)indexs separator:(NSString *)separator { if (!string) return nil; NSMutableString *mStr = [NSMutableString stringWithString:[string stringByReplacingOccurrencesOfString:separator withString:@""]]; [indexs enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSInteger index = [obj integerValue]; if (mStr.length > index) [mStr insertString:separator atIndex:index]; }]; return mStr; } @end
使用:rem
#import "ViewController.h" #import "UITextField+Extension.h" @interface ViewController () <UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UITextField *tf_phone; @property (weak, nonatomic) IBOutlet UITextField *tf_idCard; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _tf_phone.delegate = self; _tf_idCard.delegate = self; } - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField == _tf_phone) { return [UITextField textField:textField range:range string:string CharType:CharsType_numeral maxLength:11 separatorIndexs:@[@(3), @(8)] separator:@"-"]; } else if (textField == _tf_idCard) { return [UITextField textField:textField range:range string:string CharType:CharsType_numeralAndXx maxLength:18 separatorIndexs:@[@(6), @(11), @(16)] separator:@" "]; } return YES; } @end