分享一个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设备所在的国家代 ...
随机推荐
- bzoj1588: [HNOI2002]营业额统计(权值线段树)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 16863 Solved: 6789[Submit][Sta ...
- js点击特效
//点击效果博客页面点击就可以看到 <script type="text/javascript"> !function(e, t, a) { function n() ...
- 机器学习——Day 2 简单线性回归
写在开头 由于某些原因开始了机器学习,为了更好的理解和深入的思考(记录)所以开始写博客. 学习教程来源于github的Avik-Jain的100-Days-Of-MLCode 英文版:https:// ...
- 【原创分析帖】据说Google内部有史以来最难的一道面试题
逛技术平台的时候,刷到一道算法题,一眼看去,就被其开头吸引了: 摘自知乎某 Google 分布式大神的一道题,技术是Google内部出的有史以来最难的一道题 嗯,距离下班还有一段时间,就看看把. 题目 ...
- LeetCode.884-两句话中不常见的单词(Uncommon Words from Two Sentences)
这是悦乐书的第338次更新,第362篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第207题(顺位题号是884).我们给出了两个句子A和B.(一个句子是一串空格分隔的单词 ...
- 【贪心】小Y的炮[cannon]题解
模拟赛的题目,做的时候由于第二题表打太久了,只剩下40分钟,想都没想就写了一个爆搜20分... 这道题单调性很关键,下面会解释 P.S.解释在代码里 #include<cstdio> #i ...
- 5.13会话技术Cookie---Session
.会话技术: 1.会话:一次会话中包含多次请求和相应. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2.功能:在一次会话的范围内的多次请求间,共享数据 3.方式: 1.客 ...
- win2008系统日志不断出现【审核失败】
win2008系统日志不断出现[审核失败] [现象] 今天查看windows日志,在 -安全- 发现不断有消息刷出,显示 -审核失败- 事件ID为4624 的记录 每分钟大概刷新8条消息(如 ...
- Redmine使用指南
公司之前使用JIRA登bug,但是客户在美国,他们习惯于用Redmine登bug,所以我们也开始在Redmine登bug,找来一个比较全面的Redmine使用指南,不懂时直接查看. http://bl ...
- An interesting scroll background------ActionScript3.0
package { /* *@ ClassName : package::backGround *@ INTRO : the continuously scroll background *@ Aut ...