UITextField字数限制

前言

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 喜欢的盆友可以给颗小星星哦~

你可能感兴趣的:(UITextField字数限制)