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的软文