在输入框中输入手机号码/电话号码/银行卡号/身份证号时经常需要格式化显示, 用户体验更好.

网上解决方法很多,找了不少但也是不太适合,于是把其中一些修改成以下方法, 在UITextField的分类中添加过滤,浸入性小,耦合性小,用起来还是很方便的.间隔符号可以自定义,过滤条件也可以自己增加和修改, 如只能输入数字和X(身份证号)等限制.

直接上代码:

UITextField的分类:

UITextField+Extension.h

#import <UIKit/UIKit.h>
// 准许输入字符类型
typedef NS_ENUM(NSInteger, CharsType) {CharsType_numeral = 1,      // 只许数字CharsType_letter,           // 只许大小写字母CharsType_numeralAndXx,     // 只许数字加上X和xCharsType_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.m

#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

使用:

#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

UITextField加间隔符号格式化相关推荐

  1. shell编程系列15--文本处理三剑客之awk格式化输出printf

    shell编程系列15--文本处理三剑客之awk格式化输出printfprintf的格式说明符格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o 打印 ...

  2. java加载properties文件的几种方式,java高级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  3. 【Python】MySQLdb库的使用以及格式化输出字段中的值

    一.项目简单介绍 我们获取字段的内容方式有很多种,但基本都要ctrl+c(复制)ctrl+v粘贴,然后还有手动去更改 而以python作为处理工具将会快很多,本项目需要安装的库:MySQLdb,pan ...

  4. Android平台SDCARD格式化

    想了好多天 没想明白到底怎么弄,昨天 一朋友告诉我用aidl 试了下,还真的成功了!! 下面我们来看看到底怎么实现的吧   因为google并没有给我们暴露卸载sdcard和格式化sdcard的api ...

  5. sed 和 awk 的一些用法

    为什么80%的码农都做不了架构师?>>>    1. 截取test 文件指定字段 test文件内容: ert fff ** [abcfd] 123 324 444 [rty] ** ...

  6. 自定义服务器控件(扩展现有 Web 控件)

    很多情况下,你并不需要从头开始创建一个新控件.有些功能也许在 ASP.NET 的 Web 控件的基本集合中已经存在了.所有这些控件都是普通类,你可以组合它们(使用其他类的实例来创建一个新类)或者继承它 ...

  7. iOS 限制输入字数完美解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 关于限制输入字数以前也做过,网上也很多方法. 但都不够完美,以前的测试人员也没千方百计的挑毛病,所以就糊弄过去了. 现在这个项 ...

  8. Bash Cookbook 学习笔记 【中级】

    Read Me 本文是以英文版<bash cookbook> 为基础整理的笔记,力求脱水 2018.01.21 更新完[中级].内容包括工具.函数.中断及时间处理等进阶主题. 本系列其他两 ...

  9. SpringMVC日期类型转换问题处理方法归纳

    前言 我们在SpringMVC开发中,可能遇到比较多的问题就是前台与后 台实体类之间日期转换处理的问题了,说问题也不大,但很多人开发中经常会遇到这个问题,有时很令人头疼,有时间问题暴露的不是很明显,然 ...

最新文章

  1. [svc]samba服务搭建
  2. R语言使用integrate函数进行函数积分计算实战
  3. 使用 window.alert()
  4. Qt 通过鼠标移动窗口
  5. Python mat与array的区别
  6. 即时通讯软件测试方法,Linux系统环境下如何使用aMsn即时通讯
  7. 这个世界太小了,刚才我们老师搞块板给我,叫我弄个android上去,我发现核心板是sate210——O(∩_∩)O~...
  8. 如何解决分布式系统中的“幽灵复现”?-转载自 阿里技术 微信公众号
  9. flask如何查询mysql_bootstrap+flask+mysql实现网站查询
  10. Git用户签名设置,用户级别
  11. kafka(五)服务器配置优化
  12. CSS demo:flaot amp; clear float
  13. [面试] C/C++ 语法细节拾遗
  14. 新浪微博 sso 登录 iOS遇到的几个问题
  15. 高级shell编程讲解
  16. MySQL下载步骤详解
  17. 利用ESP定律进行脱壳 ——合天网安实验室学习笔记
  18. java支付宝支付,支付手机支付,pc网站支付
  19. “共码未来”——2022Google开发者大会纪行
  20. 基于51单片机的LCD1602电子时钟

热门文章

  1. 输入输出挂,手动扩栈。
  2. gbk转utf-8 iconv 编码转换
  3. 大数据之-Hadoop3.x_MapReduce_分区数与reduce个数总结---大数据之hadoop3.x工作笔记0113
  4. SpringCloud学习笔记029---在SpringCloud项目中使用Zuul实现基本的网关统一处理
  5. JAVA学习笔记001---认识了解NIO
  6. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...
  7. IOS学习笔记04---编写第一个C语言程序-Hello World
  8. 模型flops 的计算方法
  9. Linux有问必答:如何在树莓派上安装USB网络摄像头
  10. 《How to Generate a Good Word Embedding?》导读(转)