分享一个iOS输入框特殊限制的代码 UITextField (Validation)
//个人总结。欢迎新增或改动
#import <UIKit/UIKit.h>
typedef enum{
VALIDATION_TYPE_NUM_VALIDATED = 0,//数字
VALIDATION_TYPE_ID_CARD_VALIDATED = 1,//身份证
VALIDATION_TYPE_MOBILE_PHONE_VALIDATED = 2,//手机号
VALIDATION_TYPE_EMAIL_VALIDATED = 3,//email
} ValidationType; @interface UITextField (Validation) -(void)setValidationType:(ValidationType)validationType; -(NSString *)errorMessage; - (void)limitTextLength:(int)length;
@end
#import "UITextField+Validation.h"
#import <objc/objc.h>
#import <objc/runtime.h>
static NSString *kLimitTextMaxLengthKey = @"kLimitTextMaxLengthKey";
static NSString *kLimitTextErrorMessageKey = @"kLimitTextErrorMessageKey"; @implementation UITextField (Validation) -(void)resetTextfieldValidation
{
objc_setAssociatedObject(self, (__bridge const void *)(kLimitTextErrorMessageKey), nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void)setValidationType:(ValidationType)validationType
{
[self addTarget:self action:@selector(resetTextfieldValidation) forControlEvents:UIControlEventEditingDidBegin];
self.keyboardType = UIKeyboardTypeDefault; if (validationType == VALIDATION_TYPE_NUM_VALIDATED) {
[self limitTextOnlyNumber];
self.keyboardType = UIKeyboardTypeNumberPad;
}else if(validationType == VALIDATION_TYPE_EMAIL_VALIDATED){
[self limitTextOnlyEmail];
self.keyboardType = UIKeyboardTypeEmailAddress;
}else if(validationType == VALIDATION_TYPE_MOBILE_PHONE_VALIDATED){
[self limitTextOnlyPhone];
self.keyboardType = UIKeyboardTypePhonePad;
}else if(validationType == VALIDATION_TYPE_ID_CARD_VALIDATED){
[self limitTextOnlyIDCard];
} [self limitTextNoSpace];
} -(NSString *)errorMessage
{
NSString *str= objc_getAssociatedObject(self, (__bridge const void *)(kLimitTextErrorMessageKey));
if (str) {
return str;
}
return nil;
} #pragma mark - Limit Text Length
- (void)limitTextLength:(int)length
{
objc_setAssociatedObject(self, (__bridge const void *)(kLimitTextMaxLengthKey), [NSNumber numberWithInt:length], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self addTarget:self action:@selector(textFieldTextLengthLimit:) forControlEvents:UIControlEventEditingChanged];
} - (void)textFieldTextLengthLimit:(id)sender
{
NSNumber *maxLengthNumber = objc_getAssociatedObject(self, (__bridge const void *)(kLimitTextMaxLengthKey));
int maxLength = [maxLengthNumber intValue];
if(self.text.length > maxLength){
self.text = [self.text substringToIndex:maxLength];
}
} #pragma mark - Limit Text Only Number
-(void)limitTextOnlyNumber
{
[self addTarget:self action:@selector(textFieldTextNumberLimit:) forControlEvents:UIControlEventEditingChanged];
}
- (void)textFieldTextNumberLimit:(id)sender
{
if (!self.text.length) {
[self resetTextfieldValidation];
return;
}
NSString * regexNum = @"^\\d*$";
NSPredicate *regexNumPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regexNum];
if ([regexNumPredicate evaluateWithObject:self.text]==YES) {
}else{
self.text=[self.text substringFromIndex:self.text.length];
}
} #pragma mark - Limit Text Only Phone
-(void)limitTextOnlyPhone
{
[self addTarget:self action:@selector(textFieldTextPhoneLimit:) forControlEvents:UIControlEventEditingDidEnd];
[self limitTextLength:11];
[self limitTextOnlyNumber];
} - (void)textFieldTextPhoneLimit:(id)sender
{
if (!self.text.length) {
[self resetTextfieldValidation];
return;
}
// NSString * regex=@"^((13[0-9])|(147)|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
NSString * regex=@"^1\\d{10}$";
NSPredicate *regexPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if ([regexPredicate evaluateWithObject:self.text]==YES) {
self.text=[self.text substringToIndex:self.text.length];
[self resetTextfieldValidation];
}else{
self.text=[self.text substringToIndex:self.text.length];
objc_setAssociatedObject(self, (__bridge const void *)(kLimitTextErrorMessageKey), @"请输入正确的手机号码", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
#pragma mark - Limit Text For Email
-(void)limitTextOnlyEmail
{
[self addTarget:self action:@selector(textFieldTextForEmailLimit:) forControlEvents:UIControlEventEditingDidEnd];
} - (void)textFieldTextForEmailLimit:(id)sender
{
if (!self.text.length) {
[self resetTextfieldValidation];
return;
}
NSString *regex=@"^[a-zA-Z0-9][\\w\\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w\\.-]*[a-zA-Z0-9]\\.[a-zA-Z][a-zA-Z\\.]*[a-zA-Z]$";
NSPredicate *regexPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if ([regexPredicate evaluateWithObject:self.text]==YES) {
[self resetTextfieldValidation];
}else{
objc_setAssociatedObject(self, (__bridge const void *)(kLimitTextErrorMessageKey), @"邮箱格式错误", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
#pragma mark - Limit Text For IDCard
-(void)limitTextOnlyIDCard
{
[self addTarget:self action:@selector(textFieldTextForIDCardLimit:) forControlEvents:UIControlEventEditingDidEnd];
[self limitTextLength:18];
} - (void)textFieldTextForIDCardLimit:(id)sender
{
if (!self.text.length) {
[self resetTextfieldValidation];
return;
}
//NSString *regex=@"^(4\\d{12}(?:\\d{3})?)$";
NSString *regex=@"^([1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3})|([1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X))$";
NSPredicate *regexPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if ([regexPredicate evaluateWithObject:self.text]==YES) {
[self resetTextfieldValidation];
}else{
objc_setAssociatedObject(self, (__bridge const void *)(kLimitTextErrorMessageKey), @"身份证格式错误", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
} #pragma mark - Limit Text NoSpace
- (void)limitTextNoSpace
{
[self addTarget:self action:@selector(textFieldTextNoSpaceLimit:) forControlEvents:UIControlEventEditingDidEnd];
} - (void)textFieldTextNoSpaceLimit:(id)sender
{
self.text = [self noSpaceString:self.text];
}
- (NSString *)noSpaceString:(NSString *)str
{
if (str.length) {
return [str stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
} return str;
}
@end
分享一个iOS输入框特殊限制的代码 UITextField (Validation)的更多相关文章
- 分享,iOS国家手机区号代码.plist
APP注册需要手机号码的时候,如果有在其他国家的时候需要填写手机区号 一份有国家名字和区号的plist 参照微信注册的时候 格式是 <Array> <Array> <Ar ...
- 分享一个单例模型类Singleton代码
相关代码: ; foreach (string key in dict.Keys) { if (cou ...
- 一个ios的各种组件、代码分类,供参考
http://github.ibireme.com/github/list/ios/#
- iOS/iPhone学习系列、代码教程
part 1--入门: 1. xcode 版本下载 以及 iphone sdk 下载: 最新版本在此下载: http://developer.apple.com/devcenter/ios/index ...
- 【好程序员笔记分享】——iOS开发之纯代码键盘退出
-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之纯代码键盘退出(非常简单) iOS开发之纯代码键盘退出 前面说到了好几次关于键盘退出的,但 ...
- 【腾讯Bugly干货分享】iOS黑客技术大揭秘
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5791da152168f2690e72daa4 “8小时内拼工作,8小时外拼成长 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- React Native微信分享 朋友圈分享 Android/iOS 通用
超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用 2016/06/16 | React Native技术文章 | Sky丶清| 暂无评论 | 1 ...
- Unity3D开发之“获取IOS设备所在的国家代码"
原地址:http://dong2008hong.blog.163.com/blog/static/469688272014021025578/ 在前一段时间游戏开发中需要实现获取IOS设备所在的国家代 ...
随机推荐
- 【NOIP2018】 游记
All ended? [day 0] 一点感觉没有,不过翘掉了早上的课(当然还有前三周的课),然后刚想睡一会儿,就被通知要上车了/难受 在车上玩了一会儿早上下的Super Mario(主要是早上刷了一 ...
- 如何在Eclipse中创建Web服务器
使用Eclipse开发Web项目时,需要先配置Web服务器,如果已经配置好Web服务器,就不需要再重新配置了.也就是说,本节的内容不是开发每个项目时,都必须经过的步骤.创建Web服务器的具体步骤如下: ...
- 本博客基本不再更新,请移步至我的CSDN博客
本博客基本不再更新,请移步至我的CSDN博客:http://blog.csdn.net/wpxu08
- Kind (type theory)-higher-kinded types--type constructor
, pronounced "type", is the kind of all data types seen as nullary type constructors, and ...
- 修改默认的gitlab clone地址,要不每次都得自己修改
这个是无法clone的,得换成gitlab的ip地址 下面进行修改 sudo vim /opt/gitlab/embedded/service/gitlab-rails/config/ ...
- Nginx服务的地址重写
调整Nginx服务器配置,实现: 1.所有访问a.html的请求,重定向到b.html; 2.所有访问Nginx服务器(192.168.4.1)的请求重定向至www.baidu.com: 3.所有访问 ...
- log日志模块得作用
import logginglogger=logging.getLogger()logger.setLevel(logging.DEBUG)#控制台输出日志'''consle=logging.Stre ...
- 【剑指Offer】28、数组中出现次数超过一半的数字
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...
- 以豌豆荚为例,用 Scrapy 爬取分类多级页面
本文转载自以下网站:以豌豆荚为例,用 Scrapy 爬取分类多级页面 https://www.makcyun.top/web_scraping_withpython17.html 需要学习的地方: 1 ...
- 三剑客基础详解(grep、sed、awk)
目录 三剑客基础详解 三剑客之grep详解 1.通配符 2.基础正则 3.grep 讲解 4.拓展正则 5.POSIX字符类 三剑客之sed讲解 1.sed的执行流程 2.语法格式 三剑客之Awk 1 ...