????? 項目中遇到這么一個問題烦租,需要對用戶昵稱長度做限制榛泛,起初沒想太多,那就直接在UITextFieldDelegate的一個協(xié)議中做就OK啊筒繁,協(xié)議如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text
我自己在模擬器上是可以的,后來測試給我報個bug巴元,說不行毡咏,我仔細看其操作,他用了聯(lián)想輸入逮刨,還用了第三方輸入法呕缭。。修己。確實不行臊旭,好吧,看來這個協(xié)議是不行的箩退,就想著監(jiān)聽唄离熏,監(jiān)聽這個UITextField,代碼如下:
首先在ViewDidLoad方法中注冊通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldEditChanged:) name:UITextFieldTextDidChangeNotification object:self.textField];
然后實現(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:@"昵稱長度不能超過30個字符" 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];
? ? ? ? ? ? }
? ? ? ? }
? ? }
}