有很多的使用场景需要限制用户的输入字数,比如聊天,回帖,发朋友圈之类的。
经研究找到了比较全面稳定的实现方案。
首先监听需要限制字数的 UITextField,下面两种方法都可以
1
2
3
4
5
6
|
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldDidChange:)
name:@"UITextFieldTextDidChangeNotification"
object:myTextField];
[self addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
|
然后实现方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
// 限制输入字数为kBeiZhuMaxLength个字的监听方法
- (void)textFieldDidChange:(UITextField *)textField
{
if (textField == self.beiZhuTfd) {
NSString *toBeString = textField.text;
//获取高亮部分
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position || !selectedRange)
{
if (toBeString.length > kBeiZhuMaxLength)
{
// 处理Emoji被截断的情况,rangeOfComposedCharacterSequenceAtIndex截取的最小单位是子串而不是unichar
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:kBeiZhuMaxLength];
if (rangeIndex.length == 1)
{
textField.text = [toBeString substringToIndex:kBeiZhuMaxLength];
}
else
{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, kBeiZhuMaxLength)];
textField.text = [toBeString substringWithRange:rangeRange];
}
}
}
}
}
|
参考文章: 如何较柔和完美的实现UITextField、UITextView限制输入指定字数的问题