完美的UITextField字符限制方案

在做一个基本的输入框时,需求限制20字,到达20字之后无法继续输入,虽然是简单子字符限制,但也在开发过程中踩了好几个坑,最后总结了一个完美的字符限制方案,可以应对各种边界输入的情况

1
2
3
4
5
6
7
NotificationCenter.default.rx.notification(NSNotification.Name(rawValue:
"UITextFieldTextDidChangeNotification"), object: textField).subscribe(onNext: { (noti) in
guard let textField = noti.object as? UITextField, let text = textField.text as NSString? else { return }
if textField.markedTextRange == nil, textField.length > nickNameMaxLength {
textField.text = text.substring(to: text.rangeOfComposedCharacterSequences(for: NSRange(location: 0, length: nickNameMaxLength)).upperBound)
}
}).disposed(by: disposeBag)
  • 使用RxSwift监听UITextFieldTextDidChangeNotification,每次文本变化时接收回调
  • markedTextRange:防止最后一个字需要输入汉字时,用拼音只能输入一个字母的情况
  • rangeOfComposedCharacterSequences:防止最后一个字符为Emoji被截断的问题