前言
UITextField、UITextView字数输入限制相信是大多数朋友项目开发中都会遇到的基本需求,网上的解决方案也挺多的,有采用Delegate的也有添加采用监听的方式。一开始小编也采用监听的方式,后面发现代码看起来嫉妒不简洁,使用起来也比较麻烦,所以进行了优化。下面先介绍一开始采用的方式以及优化的过程,着急的盆友可以直接到查看文末,也可以下载优化后的文件哦~
监听方式
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:self.verificationTF];
- (void) textFieldDidChange:(NSNotification *)notification {
// 处理字数限制
}
以这种的话就得在需要字数限制的地方都得加上以上的监听和实现,所以是十分繁琐。
分类方式
经过一番思考之后采用了分类+Runtime的方法。具体实现如下:
- 给分类添加最长字数和编辑代理回调的属性
typedef void(^UITextFieldLimitBlock)(void);
// 编辑代理回调
@property (nonatomic, copy) UITextFieldLimitBlock limitBlock;
/// 最长字数
@property (nonatomic, assign) int maxLength;
- 添加两个调用方法
/**
字数限制-不自动裁剪
@param limitBlock UITextFieldLimitBlock
*/
- (void)lengthLimit:(UITextFieldLimitBlock)limitBlock;
/**
字数限制-自动裁剪
@param maxLength 最大长度
@param limitBlock UITextFieldLimitBlock
*/
- (void)lengthLimitWithMaxLength:(int)maxLength limitBlock:(UITextFieldLimitBlock)limitBlock;
- 利用Runtime给分类关联对象
- (void)setLimitBlock:(UITextFieldLimitBlock)limitBlock
{
objc_setAssociatedObject(self, &limit, limitBlock, OBJC_ASSOCIATION_COPY);
}
- (UITextFieldLimitBlock)limitBlock
{
return objc_getAssociatedObject(self, &limit);
}
- (void)setMaxLength:(int)maxLength
{
objc_setAssociatedObject(self, &length, @(maxLength), OBJC_ASSOCIATION_COPY);
}
- (int)maxLength
{
NSNumber *maxLength = objc_getAssociatedObject(self, &length);
return [maxLength intValue];
}
- 调用方法如下
[self.textField lengthLimit:^{
// 处理字数改变
}];
Runtime真是个大宝贝,有何疑问或是有更好方法的盆友欢迎下方评论交流哦~
Demo地址:UITextField-Expand 喜欢的盆友可以给颗小星星哦~
网友评论