文档章节

iOS 限制textField字节长度

悟空我腿有点酸
 悟空我腿有点酸
发布于 2016/02/05 18:38
字数 582
阅读 471
收藏 4

OC语言中,NSString类型的字符串,视英文字母和汉字都为一个长度(string.length把一个汉字也当做一个长度),而实际上,一个英文字母只占用1个字节,一个汉字占用2个字节。

有时又有需求,需要限定字节数目,而不是内容个数,就需要通过一些方法获取到字符串的字节数。比如,限定10个字节,则最多可以输入10个英文字母,或者5个汉字。

监听textField的长度变化,就需要设置textField的代理。

但是有个bug,监听内容变化的代理方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

在点击键盘输入是正常的,但如果不点击键盘按键,拿汉字输入举例,输入一个字后,键盘上面会出现与该字可能是词语的字,点上面出现的字来输入,就不会触发上面的代理方法。

所以这个代理方法不能用,我们需要通过注册textField的通知来监听。


//注册通知,textfield内容改变调用
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:self.testTextField];



实现通知方法

- (void)textFieldDidChange:(NSNotification *)note{
    UITextField *textField = note.object;
    //获取文本框内容的字节数
    int bytes = [self stringConvertToInt:self.testTextField.text];
    //设置不能超过32个字节,因为不能有半个汉字,所以以字符串长度为单位。
    if (bytes > 16)
    {
       //超出字节数,还是原来的内容
        self.testTextField.text = self.lastTextContent;
    }
    else
    {
        self.lastTextContent = self.testTextField.text;
    }
}
//得到字节数函数
-  (int)stringConvertToInt:(NSString*)strtemp
{   
    int strlength = 0; 
    char* p = (char*)[strtemp cStringUsingEncoding:NSUnicodeStringEncoding];
    for (int i=0 ; i<[strtemp lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++)
    {        
       if (*p) {    
           p++;           
           strlength++;      
       }       
       else {      
           p++;       
       }
    }
    return (strlength+1)/2;
}



如果textField一开始就有内容,就要获取到,用代理方法

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    self.lastTextContent = textField.text;
    return YES;
}


© 著作权归作者所有

悟空我腿有点酸
粉丝 1
博文 3
码字总数 1182
作品 0
海淀
私信 提问
iOS 指定长度字符串填充整个TextField

iOS实现指定长度字符串占满整个TextField,支持支付宝和微信密码输入样式。 实例 实现思路 采用两个TextField,一个只负责显示,重写它的drawText方法; 另一个只负责输入,设置它的字体颜色透...

LvesLi
05/10
0
0
iOS 12 在系统中文键盘上使用 AutoFill 会遇到诡异的问题以及解决方案

感谢我们 iOS 团队发现此 bug。 一. 问题描述 首先,创建一个 textField,使用 addTarget 函数来监听 textField 的 editingChanged 事件。 如果系统升级到最新的 iOS 12.0,并结合系统中文键...

fengzhizi715
2018/09/20
0
0
iOS 实现对称加密多种填充方式(ANSIX923、ISO10126、Zero)

前言 前段时间调研了iOS有关加密的框架.在查阅资料的过程中,有一篇《iOS加密解密:AES,DES,3DES,BLOWFISH(含有多种模式和算法说明)》 的文章。 在文章中作者对需要加密的数据实现PKCS7Pa...

_涼城
2018/05/27
0
0
[C++][IO]fstream用法

fstream用法 1. 打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: void open(const char* filename,int mode,int access); 参数: filename:  要打开的文件...

guitar_zp
2011/08/09
0
0
NativeScript 3.1.0 发布,Native 跨平台应用

NativeScript 3.1.0 已发布,NativeScript 可以使用 Javascript,CSS, XML 创建真正的 Native 跨平台应用,支持 iOS Android,NativeScript 将跨平台代码翻译成目标平台的代码。 更新内容: ...

两味真火
2017/06/23
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

一个简单易用的Linux文本编辑器:nano的安装与使用

许多状况下咱们都必要编纂云主机里的文本情节,而现时用的比力多的文本编纂器是vim,这个估量许多人都以为很难用,这边伏笔VPS引荐一个简略易用的文本编纂器nano,比vim简略许多,很轻易上手...

shzwork
32分钟前
3
0
go recover

异常、错误常见语言处理 一般语言都有其错误处理方式,就以鄙人熟悉的php来距离吧。 PHP有多个级别的错误处理方式,以防止程序在还未正确执行完毕时,就造成了程序的提前结束。 try/catch/fi...

o0无忧亦无怖
51分钟前
1
0
玩转混合云+边缘计算,且看ZStack Mini!

文章导读:2019年4月16日,ZStack新品和合作伙伴战略发布会上,面向集团客户和边缘场景需求,ZStack重磅推出ZStack Mini超融合一体机(以下简称:ZStack Mini)和ZStack多云管理平台(以下简...

ZStack社区版
52分钟前
2
0
springboot 整合redis

springboot整合redis官方是有文档的: 英文看不懂可以翻译,代码应该看得懂, 这个是自动注入的。当然也可以xml注入,手动配置。 整合步骤: pom文件: <!-- spring boot web --> ...

jason_kiss
56分钟前
2
0
手机耗电问题,大部分是没有正确使用这个“锁”

当安卓设备闲置时,设备很快会进入休眠状态,以达到省电和减少CPU占用的目的。但有些应用在手机灭屏甚至系统休眠时,依然频繁占用CPU处理事件或唤醒屏幕提示用户消息,这类行为会导致手机耗电...

安卓绿色联盟
57分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部