zoukankan      html  css  js  c++  java
  • 一篇关于监控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;
    }

     

     

  • 相关阅读:
    Bot Style Tests VS Page Objects
    Qemu文档
    PlantUML
    include <xxx.h> 和 include "xxxx.h"的区别
    2021.40 喜欢当下
    2021.39 MIUI崩溃
    2021.38 聚焦
    2021.37 心流
    2021.36 负熵
    2021.35 精神熵
  • 原文地址:https://www.cnblogs.com/lingzhiguiji/p/3919941.html
Copyright © 2011-2022 走看看