[iOS] UITextField如何准确限制中文输入文本长度

UITextField在iOS界面开发中是一个非常常见的控件,而对输入框做适当的长度限制也是iOS App开发中一个相当常见的需求。非常不幸,UITextField却没有提供一个简洁的方法来达到这一要求。

可以通过UITextFieldDelegate来进行判断,这也是目前网上大家的普遍做法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

    if (range.length + range.location > textField.text.length)

    {

        return NO;

    }

    if (textField == _nameField || textField == _dpswField) {

        NSUInteger newLength = [textField.text length] + [string length] - range.length;

        return (newLength > TextFieldMaxLength) ? NO : YES;

    }

    return YES;

}

这个代理是判断UITextField是否允许编辑的依据,包括输入,替换和字符删除。range的location是编辑字符的开始位置,range的length代表长度。如果从字符串尾部一个字符一个字符的输入,location是你当前字符串的长度,也就是字符串的尾部,length是0,string则是输入的新字符串。这个代理传入的参数就是表示,是否允许在字符串的尾部位置新追加该string?如果从尾部删除一个字符,location是当前字符串的长度-1,length为1,string为空,表示是否允许替换末尾最后一个字符为空?也就是删除。。

来自伟大中国的程序员,方案到这里算完成了么?如果你问问stackoverflow,肯定也是比较perfect的方案了。那是因为国外的程序员大部分用英语输入法做为主要应用场景。但是我们使用拼音输入法,iOS原生的拼音输入法还支持联想输入。如果对用户体验要求足够高的话,你肯定会发现,当使用拼音联想输入后,联想输入的部分是不会触发这个代理函数的,也就是说可以轻松绕过这层判断。

UITextField是继承自UIControl的,UIControl恰巧可以监听文本是否被修改的事件。

[_nameField addTarget:self action:@selector(textFieldDidChanged: ) forControlEvents:UIControlEventEditingChanged];

textFieldDidChanged 里需要做的就是判断当前输入法是否是中文输入法以及输入状态是否是联想状态,在联想输入状态下,比如gx,联想的汉字可能是“高兴”,但是拿到的gx会占位4个字符长度,当确认变为“高兴”输入后,才变成2个字符长度。所以联想状态下可以不考虑联想输入状态。

- (void)textFieldDidChanged:(UITextField *)textField

{

    if (textField == _nameField) {

        NSString *currentString = textField.text;

//获取当前的输入法语言,包括iOS自带的拼音输入法以及sogou,baidu中文输入法都涵盖在内

        NSString *currentLang = [[textField textInputMode] primaryLanguage]; 

        if ([lang isEqualToString:@"zh-Hans"] == YES) {

    //获取高亮部分

            UITextRange *markedRange = [textField markedTextRange];

            UITextPosition *markedPosition = [textField positionFromPosition:markedRange.start offset:0];

            // 只对已输入完成的文字进行字数统计和限制

            if (!markedPosition) {

                if (currentString.length > TextFieldMaxLength) {

                    textField.text = [currentString substringToIndex:TextFieldMaxLength];

                }

            }

        }

    }

}

中文输入限定长度完美解决!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值