分享一个iOS输入框特殊限制的代码 UITextField (Validation)
2024-08-31 05:41:01
//个人总结。欢迎新增或改动
#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
最新文章
- httpclient瓶颈
- 鼠标选择文字事件js代码,增加层问题
- 性能测试工具ab
- Linux网络编程8&mdash;&mdash;对TCP与UDP的简易封装
- python基础之使用os.system来执行系统命令
- HTML颜色编码
- 计算新浪Weibo消息长度
- Linux系统监控
- 用Teleport Ultra下载网站全部页面 爬虫
- hdu 5652 India and China Origins 二分+bfs
- CAS (1) —— Mac下配置CAS到Tomcat(服务端)(转)
- oc内容5大区
- 转换成maven时报错
- jQuery选择器中的空格问题
- Java基础--二维数组
- MySQL中InnoDB锁不住表的原因
- pycharm如何回到过去某个时间
- 洛谷 P4009 汽车加油行驶问题 解题报告
- C#监控文件夹变化
- canvas之抒写文字