iOS TextField输入限制(限制长度、只能输入数字,只能输入数字字母……)
项目中各个地方都会用到textField,textField的输入也会有各种需求,各种限制,每次用到的时候要重写一遍这些限制,导致各种垃圾代码,各种重复,有一天,我终于看不下去了,于是把textField的输入限制封装成在了一起,方便后续开发使用,代码量也减少了很多,这里把封装的View提供出来,有需要的可以参考一下(关于textView输入限制设置placeholder请参考我的文章iOS textView限制输入)。demo下载地址:https://github.com/qqcc1388/TYLimitInputDemo
TYLimitedTextField能够快速实现以下功能(支持xib):
1. 限制输入的字符(数字,字母,数字+字母,email等)
2. 提供一个可以监听textField实时改变的方法,不需要自己去写观察者
3. 限制输入文字的最大长度
4. 限制textField距离leftPading rightPading
5. 更方便快捷的设置leftView rightView
6. 设置placeholderColor
话不多说了 上代码
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSUInteger, TYLimitedTextFieldType) {
TYLimitedTextFieldTypeNomal = 0, //系统默认键盘
TYLimitedTextFieldTypeNumber, //数字
TYLimitedTextFieldTypeNumberOrLetter, //数字和字母
TYLimitedTextFieldTypeEmail, //数字 字母 和 特定字符( '.' '@')
};
@class TYLimitedTextField;
@protocol TYLimitedTextFieldDelegate <NSObject>
//为了防止 self.delegate = self 然后外部有重写了这个delegate方法导致代理失效的问题,这里重写一遍系统的代理方法
//在使用TYLimitedTextField的使用请不要使用UITextField本身代理方法
@optional // ----这里只是拓展了textField的部分代理,如果有需要还可以自己实现在这里添加
/**
键盘return键点击调用
@param textField TYLimitedTextField
*/
-(BOOL)limitedTextFieldShouldReturn:(UITextField *)textField;
/**
输入结束调用
@param textField TYLimitedTextField
*/
-(void)limitedTextFieldDidEndEditing:(UITextField *)textField;
/**
输入内容改变调用(实时变化)
@param textField TYLimitedTextField
*/
-(void)limitedTextFieldDidChange:(UITextField *)textField;
@end
@interface TYLimitedTextField : UITextField
/**
代理方法 尽量使用这个代理而不是用textfield的代理
*/
@property (nonatomic,weak) id<TYLimitedTextFieldDelegate> realDelegate;
/**
TYLimitedTextFieldType 根据type值不同 给出不同limited 默认TYLimitedTextFieldTypeNomal
*/
@property (nonatomic,assign) TYLimitedTextFieldType limitedType;
/**
textField允许输入的最大长度 默认 0不限制
*/
@property (nonatomic,assign) NSInteger maxLength;
/**
距离左边的间距 默认0
*/
@property (nonatomic,assign) CGFloat leftPadding;
/**
距离右边的间距 默认 0
*/
@property (nonatomic,assign) CGFloat rightPadding;
/**
给placeHolder设置颜色
*/
@property (nonatomic,strong) UIColor *placeholderColor;
/**
textField -> leftView
*/
@property (nonatomic,strong) UIView *customLeftView;
/**
textField -> rightView
*/
@property (nonatomic,strong) UIView *customRightView;
@end
#import "TYLimitedTextField.h"
//字母+数字
#define kLetterNum @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#define kEmail @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@"
@interface TYLimitedTextField () <UITextFieldDelegate>
//筛选条件
@property (nonatomic,copy) NSString *filter;
@end
@implementation TYLimitedTextField
-(instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self initialize];
}
return self;
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super initWithCoder:aDecoder]) {
[self initialize];
}
return self;
}
-(void)initialize{
//设置默认值
self.rightPadding = 5;
self.leftPadding = 5;
self.limitedType = TYLimitedTextFieldTypeNomal;
//设置边框和颜色
self.layer.cornerRadius = 5;
self.backgroundColor = [UIColor whiteColor];
self.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0];
self.font = [UIFont systemFontOfSize:14];
//设置代理 这里delegate = self 外面就不可以在使用textField的delegate 否则这个代理将会失效
self.delegate = self;
[self addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
#pragma mark - textFieldDelegate
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
if (_realDelegate && [_realDelegate respondsToSelector:@selector(limitedTextFieldShouldReturn:)]) {
return [_realDelegate limitedTextFieldShouldReturn:textField];
}
return YES;
}
-(void)textFieldDidEndEditing:(UITextField *)textField{
if (_realDelegate && [_realDelegate respondsToSelector:@selector(limitedTextFieldDidEndEditing:)]) {
[_realDelegate limitedTextFieldDidEndEditing:textField];
}
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//超过最大长度 并且不是取消键被点击了
if ((textField.text.length >= self.maxLength) && self.maxLength && ![string isEqualToString:@""]) { return NO;}
if (!self.filter) { return YES;}
//限制条件
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:self.filter] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; //按cs分离出数组,数组按@""分离出字符串
return [string isEqualToString:filtered];
}
//textField内容有变化会调用这个方法
-(void)textFieldDidChange:(UITextField *)textField{
if (_realDelegate && [_realDelegate respondsToSelector:@selector(limitedTextFieldDidChange:)]) {
[_realDelegate limitedTextFieldDidChange:textField];
}
}
#pragma mark - setter getter
-(void)setLimitedType:(TYLimitedTextFieldType)limitedType{
_limitedType = limitedType;
//根据Type选择键盘
if (limitedType == TYLimitedTextFieldTypeNomal) {
self.keyboardType = UIKeyboardTypeDefault;
self.filter = nil;
}else{ //限制输入这里使用自定义键盘
self.keyboardType = UIKeyboardTypeASCIICapable;
if (limitedType == TYLimitedTextFieldTypeNumber) { //数字
self.keyboardType = UIKeyboardTypeNumberPad;
self.filter = nil;
}else if(limitedType == TYLimitedTextFieldTypeNumberOrLetter){ //数字和字母
self.filter = kLetterNum;
}else if(limitedType == TYLimitedTextFieldTypeEmail){ //email
self.filter = kEmail;
}
}
}
-(void)setLeftPadding:(CGFloat)leftPadding{
_leftPadding = leftPadding;
[self setValue:@(leftPadding) forKey:@"paddingLeft"];
}
-(void)setRightPadding:(CGFloat)rightPadding{
_rightPadding = rightPadding;
[self setValue:@(rightPadding) forKey:@"paddingRight"];
}
-(void)setPlaceholderColor:(UIColor *)placeholderColor{
_placeholderColor = placeholderColor;
[self setValue:_placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
}
-(void)setCustomLeftView:(UIView *)customLeftView{
_customLeftView = customLeftView;
self.leftView = customLeftView;
self.leftViewMode = UITextFieldViewModeAlways;
}
-(void)setCustomRightView:(UIView *)customRightView{
_customRightView = customRightView;
self.rightView = customRightView;
self.rightViewMode = UITextFieldViewModeAlways;
}
@end
使用起来也非常简单 需要仅仅只是需要设置限制
//设置限制键盘类型
self.textField.limitedType = TYLimitedTextFieldTypeEmail;
//设置最大长度
self.textField.maxLength = 11;
//设置leftPading rightPading
self.textField.leftPadding = 10;
self.textField.rightPadding = 10;
//设置placehoder 注意顺序性 先设置文字再设置颜色
self.textField.placeholder = @"请开始你的表演";
self.textField.placeholderColor = [UIColor redColor];
//设置leftView rightView
UIButton *item = [UIButton buttonWithType:UIButtonTypeContactAdd];
self.textField.customLeftView = item;
如果需要监听简单事件则需要实现代理realDelegate
self.textField.realDelegate = self;
-(BOOL)limitedTextFieldShouldReturn:(UITextField *)textField{
NSLog(@"点击了return");
return YES;
}
-(void)limitedTextFieldDidEndEditing:(UITextField *)textField{
NSLog(@"结束编辑 - text:%@",textField.text);
}
-(void)limitedTextFieldDidChange:(UITextField *)textField{
NSLog(@"实时监听文字改变%@",textField.text);
}
使用TYLimitedTextField一定要注意:TYLimitedTextField已经将系统的TextField部分代理方法拓展出来了,所有如果你需要使用TYLimitedTextField回调功能,请不要使用delegate而使用realDelegate,否则会出现冲突也就是self.delegate = self 的尴尬。如果拓展出来的方法不足以你使用,自己自行拓展。
转载请标注来源http://www.cnblogs.com/qqcc1388/
iOS TextField输入限制(限制长度、只能输入数字,只能输入数字字母……)的更多相关文章
- iOS textfield 限制输入字数长度
iOS textfield限制输入的最大长度 [self.textFiled addTarget:self action:@selector(textFieldDidChange:) forContr ...
- iOS(Swift) TextField限制输入文本的长度(不是字数)
最近做项目有一个特殊需求,就是需要限制一个TextField的输入文本的长度在一定范围内(注意,不是字数),上网查了一圈没有找到类似文章,这里把我的方法写进来,mark一下: 1.对TextField ...
- ios textfield如何设置,只能输入1.0-9.9内的数字,并实现时时监测效果
//byzqk- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range repla ...
- iOS textField输入金额的限制,小数点前9位,后面两位
iOS textField输入金额的限制,小数点前9位,后面两位,如果不加小数点,最大位数是9位,加上小数点,最大位数是12位,超出最大位数可删除 - (BOOL)textField:(UITextF ...
- input输入框限制仅能输入数字且规定数字长度(使用与输入手机号)
现在越来越多的账户名使用手机号来登录,为了减少前后端的交互,需要用户在输入时就要进行格式的判断, 目前的常规办法是,在输入完成后进行判断. 下面的方法是在输入时就规定只能输入数字,其他格式的字符是无法 ...
- java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}
/** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...
- 请问在C#的Winform下如何用正则表达式限制用户只能在textBox中输入18位的身份证号码。
请问在C#的Winform下如何用正则表达式限制用户只能在textBox中输入18位的身份证号码. 2013-06-18 11:07会飞的鱼儿18 | 分类:C#/.NET | 浏览101次 不能有空 ...
- js只能输入数字、汉字、字母等正则匹配
只能输英文:<input type="text" onkeyup="value=value.replace(/[^a-zA-Z]/g,'')"> 只 ...
- html 输入框 只能输入数字 只能输入字母数字组合
JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...
随机推荐
- 使用MySQLdb操作Mysql数据库
MySQLdb简介 MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司.在2008年1月16号被Sun公司收购.目前MySQL被广泛地应用在Internet上的中小型网站中.由于 ...
- maven打包 bat自动化打包
maven打包,首先cd到项目根目录,如果想跳过测试阶段,可用:mvn package -DskipTests bat命令,说明start是打开文件夹的意思:e: cd E:\workspace\it ...
- IE11中navigator.userAgent的变化
在原来判断浏览器是否是ie时,我们可以根据navigator.userAgent中时候有MSIE,但是IE11进行变革,userAgent中不在包含MSIE字段, 在实际项目中,入到类似的在控制台报错 ...
- java常见字符串的操作
/** * java常见字符串的操作 */ public class Test7 { public static void main(String args[]){ StringBuffer sBuf ...
- alt和title的区别与用法
alt和title的是我们工作中经常用到这两个属性,但是一直没有总结他们的区别.现在就对他们两个的用法做一下总结.相同点:他们都会飘出一个小浮层,显示文本内容.不同点:1.alt只能是元素的属性,而t ...
- 【LeetCode】160. Intersection of Two Linked Lists
题目: Write a program to find the node at which the intersection of two singly linked lists begins. Fo ...
- 【Android Developers Training】 59. 管理图片存储
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 排序算法总结及Java实现
1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...
- C语言之复杂链表的复制(图示详解)
什么是复杂链表? 复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点.今天我们要 ...
- 如何在家自制LED灯?很简单,我来告诉你!
首先LED分凸头.平头和凹头,当中的凹头是没无方向性. 做示宽灯这类晚间才运用的光源,用凹头就好,它没无方向性,可将整个反光碗照亮. 做转向灯等指示性的光源用,准绳上应该用凸头的,它是个聚光镜,投映的 ...