分享一个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设备所在的国家代 ...
随机推荐
- A - HQ9+
Problem description HQ9+ is a joke programming language which has only four one-character instructio ...
- python--6、常用模块
time与datetime模块 time模块,用于输出时间 在Python中,用这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按 ...
- linux 清空文件的几种方案
之前要清理文件,都是简单粗暴的rm -rf log文件,最近,发现在某些环境下,是不能删除文件本省的,又必须要清理文件的内容信息,经过亲自实验,目测以下的几种方案是可行的,方案如下: 1.采用vi命令 ...
- C# 禁止WebBrowser网页跳转时发出的声音
; const int SET_FEATURE_ON_PROCESS = 0x00000002; [DllImport("urlmon.dll")] [PreserveSig] [ ...
- 【sqli-labs】 less31 GET- Blind -Impidence mismatch -Having a WAF in front of web application (GET型基于盲注的带有WAF注入)
标题和less30一样 http://192.168.136.128/sqli-labs-master/Less-31/login.php?id=1&id=2" ")闭合的 ...
- tee
功能说明:把数据重定向到给定文件和屏幕上. 参数选项: -a 向文件追加内容,而不是覆盖. tee命令允许标准输出同时把内容写入(覆盖)到文件中的实践. tee命令允许标准输出同时把内容 ...
- Golang实现常用排序算法
主函数package main import ( "fmt" "math/rand" "sort" "time") co ...
- List集合的特有功能概述和测试
List集合的特有功能概述和测试A:List集合的特有功能概述void add(int index,E element)E remove(int index)E get(int index)E set ...
- 【WPS】表格使用VBA宏编程写入ini文件实现软件多语言
前言:公司软件最近在做多语言版本,而又来一个西班牙文版本的,之前已经做过中文版本,英文版本和法文版本,之前是同事做的,现在安排我做,之前的做法,使用wps表格,翻译好,然后一个一个复制粘贴到ini文件 ...
- selenium使用Xpath+CSS+JavaScript+jQuery的定位方法(治疗selenium各种定位不到,点击不了的并发症)
跟你说,你总是靠那个firebug,chrome的F12啥的右击复制xpath绝对总有一天踩着地雷炸的你死活定位不到,这个时候就需要自己学会动手写xpath,人脑总比电脑聪明,开始把xpath语法给我 ...