• 再谈TextField


      之前一篇博客UITextField的一些技巧总结,已经总结过UITextField使用的一些情况,后来又遇到一些新的需求,所以在此重写一篇,记录UITextField的新的使用需求和技巧。

    1、一次性删除TextField文字内容

    在登录注册界面,我们在TextField输入框中重新输入用户名的时候,需要删除之前的用户名,这时候就要按住删除按键,逐个删除。TextField可以设置一次性删除输入框中的内容,以xib拖动一个UITextField为例,在其属性设置中选择clear Button的模式,如下图

    上面我选择的模式Appears while editing表示,只要是在编辑状态下就可以一次性删除,也就是说只要该TextField处于键盘的第一响应者(firstResponder)时候。当TextField处于编辑状态时候,该输入框后面有一个浅灰色的叉叉按钮,点击按钮就可以删除输入框中的内容。

    当然代码也可以实现,

    myUITextField.clearButtonMode = UITextFieldViewModeWhileEditing;

     

    2、限制用户输入文字内容的长度

    之前做了一个功能,就是要求限制用户在密码输入框中输入12位长度以内的密码,如果超出,则不显示,也就是不能再输入了。当时在往上面找了很多的实现方式,发现都不能实现我想要的效果,因为如果是英文状态下,那很好判断;但是如果键盘模式是中文状态,那么就会出现问题,比如你输入“天气真好啊”,然后按return按键,这时候直接把对应的拼音给输入到了输入框中,超过了12个长度限制,这时候又会发现新的bug,就是超过了长度之后,也不能删除输入框中的内容。这样的代码放到项目中肯定要被老板和客户给骂死了,后来在一片中文博客中找到了解决方案,原文链接在此,主要代码如下,

    在viewDidLoad中注册一个监听TextField输入框改变的监听事件,

    - (void)viewDidLoad

    {

        [super viewDidLoad];

       [[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(textFiledEditChanged:)

                                                   name:UITextFieldTextDidChangeNotification

                                                  object:userClientTF];

    }

    实现监听的方法,

    -(void)textFiledEditChanged:(NSNotification *)obj{

        UITextField *textField = (UITextField *)obj.object;

        

        NSString *toBeString = textField.text;

        NSString *lang = [[UITextInputMode currentInputModeprimaryLanguage]; //键盘输入模式

        if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写

            UITextRange *selectedRange = [textField markedTextRange];

            //获取高亮部分

            UITextPosition *position = [textFieldpositionFromPosition:selectedRange.start offset:0];

            // 没有高亮选择的字,则对已输入的文字进行字数统计和限制

            if (!position) {

                if (toBeString.length > kMaxLength) {

                    textField.text = [toBeString substringToIndex:kMaxLength];

                }

            }

            // 有高亮选择的字符串,则暂不对文字进行统计和限制

            else{

                

            }

        }

        // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况

        else{

            if (toBeString.length > kMaxLength) {

                textField.text = [toBeString substringToIndex:kMaxLength];

            }

        }

    }

    在dealloc中注销监听事件,

    - (void)dealloc {

        [[NSNotificationCenter defaultCenter]removeObserver:self

                                                      name:UITextFieldTextDidChangeNotification

                                                     object:userClientTF];

        [super dealloc];

    }

    这样的代码层次结构看起来很简单,主要就是其中的算法逻辑,有兴趣的朋友可以好好研究下,我只是把别人的代码拷贝过来直接使用了,应该还可以更加优化。这里只是抛砖引玉。

     
  • 相关阅读:
    electron 安装失败解决办法
    面向 B 端的产品经理
    如何学习一门新语言或框架
    斑马为什么有条纹?
    沃伦·巴菲特 | 成功的 10/10/10 法则
    如果想进入一家大公司面试,你会怎么做?
    人工智能缺陷与误觉:让机器产生幻觉的「怪异事件」
    20 世纪 70 年代的太空殖民艺术
    如何实现SSH断开后 进程仍然在后台运行
    让Linux关闭终端(关闭SSH等)后,程序继续运行
  • 原文地址:https://www.cnblogs.com/allen123/p/4589140.html
Copyright © 2020-2023  润新知