iOS 限制textField字节长度

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;
}


转载于:https://my.oschina.net/u/2436242/blog/614102

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值