UITextField限制字数

来自# 小熊翻译 # App的解读:

背景: UITextField在中文九宫格键盘下会出现输入空格,具体代码如下


swift 4.2版本

    textField.addTarget(self, action: #selector(AddTagAlertView.textFieldChanged(textField:)), for: .editingChanged);

    @objc func textFieldChanged(textField:UITextField){
        let kMaxCount: Int = 8
        guard let text = textField.text else {
            return
        }
        // 高亮状态不计算长度
        if let selectedRange = textField.markedTextRange, let _: UITextPosition = textField.position(from: selectedRange.start, offset: 0) {
            return
        }
        else {
            if (text.count > kMaxCount) {
                textField.text = String(text.prefix(kMaxCount))
                MBProgressHUD.toast("最多输入8个字符", false)
            }
        }
    }

OC版本:

[_textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

- (void)textFieldDidChange:(UITextField *)textField {
   CGFloat kMaxCount = 8;
    UITextRange *selectedRange = textField.markedTextRange;
    UITextPosition *textPosition = [textField positionFromPosition:selectedRange.start offset:0];
    if (selectedRange && textPosition) {
        return;
    }
    else {
        if (textField.text.length > kMaxCount) {
            textField.text = [textField.text substringToIndex: kMaxCount-1];
            [MBProgressHUD toast:[NSString stringWithFormat:@"最多输入%d个字符", kMaxCount] :NO];
        }
    }
}


分析原因:
我们可以转换成utf8分析原因: 中文九宫格高亮状态会产生空格
textLength就是我们实际需要的字符串长度,但是九宫格状态输入时会出现空格,utf8是 -30,-128,-122,我们把这些过滤之后就得到了实际长度,但是实际限制长度的时候还是按照上面的方法进行

// 下面这段代码仅用于问题分析

        var textLength = text_result.count
        let str = textField.text?.cString(using: .utf8)
        print("str === \(String(describing: str)), \(String(describing: str?.count))")
        var list = [CChar]()
        if let charList = str {
            for char in charList {
                print("char == \(char)")
                // 中文状态下输入空格会出现 -30,-128,-122,要排除utf8为 -30,-128,-122 的影响,再计算长度
                if char != -30 && char != -128 && char != -122 {
                    list.append(char)
                }
            }
            textLength = list.count
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容