ios textfield限制中文输入长度

之前做了一个功能,就是要求限制用户在密码输入框中输入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];

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值