????? 項(xiàng)目中遇到這么一個(gè)問(wèn)題,需要對(duì)用戶昵稱長(zhǎng)度做限制,起初沒(méi)想太多,那就直接在UITextFieldDelegate的一個(gè)協(xié)議中做就OK啊,協(xié)議如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text
我自己在模擬器上是可以的,后來(lái)測(cè)試給我報(bào)個(gè)bug,說(shuō)不行,我仔細(xì)看其操作,他用了聯(lián)想輸入,還用了第三方輸入法。。。確實(shí)不行,好吧,看來(lái)這個(gè)協(xié)議是不行的,就想著監(jiān)聽(tīng)唄,監(jiān)聽(tīng)這個(gè)UITextField,代碼如下:
首先在ViewDidLoad方法中注冊(cè)通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldEditChanged:) name:UITextFieldTextDidChangeNotification object:self.textField];
然后實(shí)現(xiàn)selector方法
- (void)textFieldEditChanged:(NSNotification *)obj {
? ? ? UITextField *textField = (UITextField *)obj.object;
? ? ? NSString *toBeString = textField.text;
? ? ? UITextRange *selectedRange = [textField markedTextRange];
? ? ? UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
? ? if (!position || !selectedRange) {
? ? ? ? if (toBeString.length > MaxTextFieldTextLength) {
? ? ? ? ? ? UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"昵稱長(zhǎng)度不能超過(guò)30個(gè)字符" preferredStyle:(UIAlertControllerStyleAlert)];
? ? ? ? ? ? UIAlertAction *action = [UIAlertAction actionWithTitle:@"確定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
? ? ? ? ? ? }];
? ? ? ? ? ? [alertVC addAction:action];
? ? ? ? ? ? [self presentViewController:alertVC animated:YES completion:nil];
? ? ? ? ? ? NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:MaxTextFieldTextLength];
? ? ? ? ? ? if (rangeIndex.length == 1) {
? ? ? ? ? ? ? ? textField.text = [toBeString substringToIndex:MaxTextFieldTextLength];
? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, MaxTextFieldTextLength)];
? ? ? ? ? ? ? ? textField.text = [toBeString substringWithRange:rangeRange];
? ? ? ? ? ? }
? ? ? ? }
? ? }
}