限制 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。那 NITextFieldnimbus 框架中的一个类) 对象也就无法享受到这一服务了。

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

  可惜的是,正如上面所看到的。UITextViewUIScrollView 的子类。并不是如 UITextField 那般是 UIControl 的子类,也就是说 UITextView 无法像 UITextField 那样通过监控自身的来达到限制的目的了。

  只是好在我们在 UITextView 的说明文档中看到了几个通知:

NSString * const UITextViewTextDidBeginEditingNotification;
NSString * const UITextViewTextDidChangeNotification;
NSString * const UITextViewTextDidEndEditingNotification;

  通过这几个通知也能够得知不论什么一个 UITextView 输入文本的变化了。

咱们能够整个辅助类来做到这一点。

代码就不贴出来了,你也能够自己试验一下。想看完整代码,在这里

  

限制 UITextField 输入长度的更多相关文章

  1. 限制UITextField输入长度

    如果要限制UITextField输入长度最长不超过kMaxLength,那么需要实现做以下操作: 1.实现UITextFieldDelegate协议: 2.实现textField:shouldChan ...

  2. 简单几步实现 IOS UITextField输入长度的控制

    在ios开发过程中,我们有时候需要对UITextField的输入长度进行控制,比如输入手机号码最大长度为11位等,而ios自身又不像android那样可以设置输入框的输入长度,接下来通过简单几步实现这 ...

  3. UITextField输入长度限制

    [_yourTextField addTarget:self action:@selector(eventEditingChange:) forControlEvents:UIControlEvent ...

  4. 更好地限制一个UITextField的输入长度

    要限制一个UITextField的输入字数,首先想到的应该是通过 UITextFieldDelegate 的代理方法来限制: - (BOOL)textField:(UITextField *)text ...

  5. iOS 限制TextField输入长度(标准)

    iOS 限制TextField输入长度(标准) 网上有很多限制textField输入长度方法,但是我觉得都不是很完美,准确来说可以说是不符合实际开发的要求,因此在这里整理一下textField限制输入 ...

  6. iOS- UITextField限制输入长度

    限制输入长度的问题,在这里完美的解决了! //先创建一个textField 和 一个button. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  7. iOS之限制TextField的输入长度

    网上有很多限制textField输入长度方法,但是我觉得都不是很完美,准确来说可以说是不符合实际开发的要求,因此在这里整理一下textField限制输入长度的方法.我所采用的并不是监听方法而是最不同的 ...

  8. Android中设定EditText的输入长度(转)

    如何限定Android的Text中的输入长度呢? 方法一:可以在layout xml中加上属性android:maxLength 比如: <EditText         android:id ...

  9. iOS TextView输入长度限制 设置placeholder

    textView在使用中通常会有2个功能是最常用的 设置placeholder 限制输入长度 TYLimitedTextView刚好是为了解决这个2个问题而诞生的,下面讲解TYLimitedTextV ...

随机推荐

  1. Python下调用json.dumps中文显示问题解决办法

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,例如: import json js = json.loads('{"haha": & ...

  2. Mac OS X 开启SSH服务

    系统偏好设置-->共享 没解锁的解个锁 选中远程登录&允许所有用户 若要远程登录这台电脑, 请键入 ssh 要登录的用户名@ip地址或电脑名,例:ssh zhanghua@applede ...

  3. 从SQL2008R2导入数据到SQL2005

    从SQL2008R2导入数据到SQL2005,数据很大,数据文件大概有120G. 尝试过直接离线附加,失败 尝试过备份还原,失败 最后找到了 1.先执行 exec sp_msforeachtable ...

  4. C#面试-关于const和readonly(看了一个点赞很多的帖子有感而发!)

    前景提要: 最近大家都在面试,讨论最多.最基础的问题,莫过于“关于const和readonly常见的笔试题剖析”,等等的大牛解析.我就是一个小菜,只不过,有点不敢苟同大牛的意见.废话少说,进入重点. ...

  5. spoj SORTBIT - Sorted bit squence

    Let's consider the 32 bit representation of all integers i from m up to n inclusive (m ≤ i ≤ n; m × ...

  6. Java中传参的值传递和引用传递问题(转)

    今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...

  7. go-nsq使用简述

    一 环境依赖: golang 开发环境(version >= 1.2)          下源码,配置环境变量,执行安装脚本 gpm     依赖包管理器                     ...

  8. [BZOJ 1046] [HAOI2007] 上升序列 【DP】

    题目链接:BZOJ - 1046 题目分析 先倒着做最长下降子序列,求出 f[i],即以 i 为起点向后的最长上升子序列长度. 注意题目要求的是 xi 的字典序最小,不是数值! 如果输入的 l 大于最 ...

  9. Networking

    poj1287:http://poj.org/problem?id=1287 题意:平面上有许多点,又有许多边.每条边有一定的长度,且只会连接两个不同的点.现需要从这些边中选择某些边,使得尽可能多的点 ...

  10. 哟哟哟,JAVA组装的聊天室,最简单的实现

    太码多码码,总是多些感觉~~~ 打了快一个小时啊, 但看着一行一行的出来, 还是有成就感的~~:) VerySimpleChatServer.java import java.io.*; import ...