目录

iOS 关于 UITextField 的字数限制

目录

有很多的使用场景需要限制用户的输入字数,比如聊天,回帖,发朋友圈之类的。

经研究找到了比较全面稳定的实现方案。

首先监听需要限制字数的 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限制输入指定字数的问题