來自# 小熊翻譯 # App的解讀:
背景: UITextField在中文九宮格鍵盤下會出現(xiàn)輸入空格,具體代碼如下
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
}
// 高亮狀態(tài)不計算長度
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];
}
}
}
分析原因:
我們可以轉(zhuǎn)換成utf8分析原因: 中文九宮格
高亮狀態(tài)會產(chǎn)生空格
textLength就是我們實際需要的字符串長度,但是九宮格狀態(tài)輸入時會出現(xiàn)空格,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)")
// 中文狀態(tài)下輸入空格會出現(xiàn) -30,-128,-122,要排除utf8為 -30,-128,-122 的影響,再計算長度
if char != -30 && char != -128 && char != -122 {
list.append(char)
}
}
textLength = list.count
}