来自# 小熊翻译 # 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
}