一篇关于监控UITextField的软文

 

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

 

 

 

转载于:https://www.cnblogs.com/lingzhiguiji/p/3919941.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值