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

     

     

  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/lingzhiguiji/p/3919941.html
Copyright © 2011-2022 走看看