码迷,mamicode.com
首页 > 其他好文 > 详细

一篇关于监控UITextField的软文

时间:2014-08-18 17:52:32      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   使用   io   strong   for   

 

UITextField其实研究下发现有许多细微的问题。

这里列举一个比较突出的问题,就是监控text的的值。

恩,也许你会说,简单啊,不就是在代理里面监控么,或者用KVO观察。

那么我可以告诉你,说在代理里监控还算靠谱,但是用KVO来做,证明你就不明白何为KVC。别说怎么跑到KVC上面去了,这个不理解百度谷歌随便找或者你自己慢慢敲代码试试。

代理里监控,恩,你会想到的是这个方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

确实,这个在你输入英文的时候,确实比较靠谱,每次你输入一个字母或者数字的时候都会触发,用来处理或是屏蔽一些特殊字符的。

但是,如果你用中文输入法,你在输入拼音的时候,他会进入这个代理方法,等你去选择你需要的汉字后,他就显示在了textField上面,这也没错,问题是他不会触发上面这个方法。

所以很无语不是么。

刚好手头有RAC的库,于是使用RAC的textsignl,他就能很好的触发,即,每次改变时都会发出一个signle,然后,为什么会这样呢,我进入到他其中查看源码,原来他是相当于监控的状态

UIControlEventEditingChanged|UIControlEventEditingDidBegin

相当于add target action,因为UITextFeild是派生于UIControl,所以有对应state,所以可以使用此方法。于是问题解决。

这里需要说明一个KVO的问题,KVO是基于KVC的,需要set方法来触发,而UITextfeild的text在你输入的时候是不会触发set方法的,正如NSMutableArray里面添加一个元素,他执行的方法是add,所以也不会触发set方法,即不能被监控。

 

另外送上一个常用的代码,用来计算输入的字符的长度的:(也是拔得别人的,汉字占2个)

 

-  (int)charNumber:(NSString*)strtemp {
    
    int strlength = 0;

// 这里一定要使用gbk的编码方式,网上有很多用Unicode的,但是混合的时候都不行


    //NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);


 

char* p = (char*)[strtemp cStringUsingEncoding:NSUnicodeStringEncoding];
    for (int i=0 ; i<[strtemp lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++) {
        if (*p) {
            p++;
            strlength++;
        }
        else {
            p++;
        }
    }
    return strlength;
}

 

 

 

一篇关于监控UITextField的软文,布布扣,bubuko.com

一篇关于监控UITextField的软文

标签:des   style   blog   color   使用   io   strong   for   

原文地址:http://www.cnblogs.com/lingzhiguiji/p/3919941.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!