限制 UITextField 输入长度
限制 UITextField 输入长度
标签(空格分隔): UITextField
UITextField 是 iOS 中最经常使用的组件之中的一个。关于它也有各种各样的需求,这些需求是它本身没有提供对应的API的。限制输入框文本长度是常见的需求,UITextField 本身也并没有为此提供API。本文尝试给其加入这个功能。
1、通过 delegate 来实现(不推荐)
限制 UITextField 的输入字数,首先想到的是 UITextFieldDelegate,通过实现这个协议来实现需求:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string; // 返回 NO 就不会改变文本
OK。那咱们来试试看:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *beString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if ([beString length] > 20) {
textField.text = [beString substringToIndex:20];
return NO;
}
return YES;
}
1. 先计算出在用户输入这段文字会产生的新文本:beString。
2. 再推断beString长度是否符合长度限制(这里为20)。
3. 假设符合则返回YES。否则返回NO。
OK,这么做实现了咱们的需求,在各种输入法、中英文下都执行无误。
这就完了?NO!
我们来说说这样的解决文案的不足之处:
1. 代码量太多。
看看上面的样例,这还是仅仅是一个输入框,假设有2个、3个、N个。。
。 (这得又一次考虑一下你们的需求了)
2. 给每个要限制长度的输入框都得这么写,想想也是醉了(没错,偶曾经也是这么干的)。
2、继承 UITextField来实现(不推荐)
继承 UITextField ,覆写 setText: 方法应该是能够实现的(偶没做过)。但基于无数先辈们得出的经验:组合先于继承。
在这里用继承也是有点小问题的:假设咱们子类名字为 NLUITextFieldTextLimit。那 NITextField(nimbus 框架中的一个类) 对象也就无法享受到这一服务了。
3、分类加入属性来实现(推荐)
假设能用分类,加入一个属性来实现这个需求得多爽呀。在 UITextField 中定义一个属性就好了。
咱们来研究一下 UITextField 看看有没有可能。
@interface UITextField : UIControl
...
UITextField 是继承自 UIControl 的,那它能够监听自身的事件咯。Good!
我们仅仅要得知其输入文本变化后。再推断长度是否符合需求。看看咱们的代码:
// .h file
@interface UITextField (NLLimit)
@property (assign, nonatomic) NSUInteger nl_maxLength;
@end
// .m file
#import <objc/runtime.h>
@implementation UITextField (NLLimit)
static void *nlLimitMaxLengthKey = &nlLimitMaxLengthKey;
- (void)setNl_maxLength:(NSUInteger)nl_maxLength {
objc_setAssociatedObject(self, nlLimitMaxLengthKey, @(nl_maxLength), OBJC_ASSOCIATION_COPY);
/**
* 监控自身文本变化
*/
if (nl_maxLength > 0) {
[self addTarget:self action:@selector(_nl_valueChanged:) forControlEvents:UIControlEventAllEditingEvents];
} else {
[self removeTarget:self action:@selector(_nl_valueChanged:) forControlEvents:UIControlEventAllEditingEvents];
}
}
- (NSUInteger)nl_maxLength {
return [objc_getAssociatedObject(self, nlLimitMaxLengthKey) unsignedIntegerValue];
}
#pragma mark - private
- (void)_nl_valueChanged:(UITextField *)textField {
/**
* 在文本变化后推断文本长度是否符合需求
*/
if (self.nl_maxLength == 0) return;
if ([textField.text length] <= self.nl_maxLength) return;
NSString *subString = [textField.text substringToIndex:self.nl_maxLength];
dispatch_async(dispatch_get_main_queue(), ^{
textField.text = subString;
[textField sendActionsForControlEvents:UIControlEventEditingChanged];
});
}
@end
代码在这里。
嗯,简单直接,就是它了!
4、限制 UITextView 输入长度
在 UITextField 中我们推荐的限制文本长度的方式是通过分类中加入属性来做到的,其本质是监控自身的输入文本变化。再推断长度是否符合需求。
那 UITextView 是不是也能够这么做呢?
@interface UITextView : UIScrollView
可惜的是,正如上面所看到的。UITextView 是 UIScrollView 的子类。并不是如 UITextField 那般是 UIControl 的子类,也就是说 UITextView 无法像 UITextField 那样通过监控自身的来达到限制的目的了。
只是好在我们在 UITextView 的说明文档中看到了几个通知:
NSString * const UITextViewTextDidBeginEditingNotification;
NSString * const UITextViewTextDidChangeNotification;
NSString * const UITextViewTextDidEndEditingNotification;
通过这几个通知也能够得知不论什么一个 UITextView 输入文本的变化了。
咱们能够整个辅助类来做到这一点。
代码就不贴出来了,你也能够自己试验一下。想看完整代码,在这里。
限制 UITextField 输入长度的更多相关文章
- 限制UITextField输入长度
如果要限制UITextField输入长度最长不超过kMaxLength,那么需要实现做以下操作: 1.实现UITextFieldDelegate协议: 2.实现textField:shouldChan ...
- 简单几步实现 IOS UITextField输入长度的控制
在ios开发过程中,我们有时候需要对UITextField的输入长度进行控制,比如输入手机号码最大长度为11位等,而ios自身又不像android那样可以设置输入框的输入长度,接下来通过简单几步实现这 ...
- UITextField输入长度限制
[_yourTextField addTarget:self action:@selector(eventEditingChange:) forControlEvents:UIControlEvent ...
- 更好地限制一个UITextField的输入长度
要限制一个UITextField的输入字数,首先想到的应该是通过 UITextFieldDelegate 的代理方法来限制: - (BOOL)textField:(UITextField *)text ...
- iOS 限制TextField输入长度(标准)
iOS 限制TextField输入长度(标准) 网上有很多限制textField输入长度方法,但是我觉得都不是很完美,准确来说可以说是不符合实际开发的要求,因此在这里整理一下textField限制输入 ...
- iOS- UITextField限制输入长度
限制输入长度的问题,在这里完美的解决了! //先创建一个textField 和 一个button. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
- iOS之限制TextField的输入长度
网上有很多限制textField输入长度方法,但是我觉得都不是很完美,准确来说可以说是不符合实际开发的要求,因此在这里整理一下textField限制输入长度的方法.我所采用的并不是监听方法而是最不同的 ...
- Android中设定EditText的输入长度(转)
如何限定Android的Text中的输入长度呢? 方法一:可以在layout xml中加上属性android:maxLength 比如: <EditText android:id ...
- iOS TextView输入长度限制 设置placeholder
textView在使用中通常会有2个功能是最常用的 设置placeholder 限制输入长度 TYLimitedTextView刚好是为了解决这个2个问题而诞生的,下面讲解TYLimitedTextV ...
随机推荐
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- alsa utils工具使用
1.amixer用于控制设置 amixer [-c card] [cmd] ./amixer contents ./amixer cset ./amixer cget 2. aplay ./aplay ...
- zTree异步生成数据时无法获取到子节点的选中状态
最近在项目中遇到一个问题,需求如下: 根据选中不同的人员(ID)向后台发送ajax请求,通过返回的数据来生成该人员的权限访问树,该树目录最少为3级目录,在生成的时候会自动勾选上次保存过的选中状态,点击 ...
- 使用jQuery动态加载js脚本文件的方法
动态加载Javascript是一项非常强大且有用的技术.这方面的主题在网上已经讨论了不少,我也经常会在一些个人项目上使用RequireJS和Dojo加载js 它们很强大,但有时候也会得不偿失.如果你使 ...
- Python核心编程2第一章课后练习
1-1 在windows下的安装方法在网上下载python2.7直接安装到C盘1)在系统变量中找到path. 2)编辑path值,添加你安装的python路径,C:\Python27. 3)检验pyt ...
- JSP技术的优缺点介绍
什么是JSP?JSP可用一种简单易懂的等式表示为:HTML+Java=JSP. JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑. 网页还能通过 ...
- 转:php使用websocket示例详解
原文来自于:http://www.jb51.net/article/48019.htm 这篇文章主要介绍了php使用websocket示例,需要的朋友可以参考下 下面我画了一个图演示 client ...
- codeforces C. Devu and Partitioning of the Array
题意:给你n个数,然后分成k部分,每一个部分的和为偶数的有p个,奇数的有k-p个,如果可以划分,输出其中的一种,不可以输出NO; 思路:先输出k-p-1个奇数,再输出p-1个偶数,剩余的在进行构造. ...
- 在 C++Builder 工程里使用 Visual C++ DLL(3个工具) good
译者序: 第一次读这篇文章是在 2001 年 10 月,帮我解决了一点小问题.本来不好意思翻译,因为英语水平实在太差.最近发现不少网友在问在 C++Builder 的工程里调用 Visual C++ ...
- [置顶] 2014年八大最热门IT技能
根据Computerworld网站组织的年度预测调查,众多IT专业人士在2014年所面临的整体就业形势与今年基本持平——今年有33%的企业有计划增加IT部门的员工数量,而未来一年则有32%的企业有此打 ...