Не то, чтобы мне не нравился ответ, который я написал на этот вопрос , который был скопировать и вставить и здесь. Я постараюсь объяснить вашу ошибку.
Этот ответ основан на предположении, что ваши константы определены примерно так:
#define NUMBERS_ONLY @"1234567890"
#define CHARACTER_LIMIT 3
Причина, по которой ваша логика не работает, состоит в том, что вы никогда не обрабатываете событие, когда newLength
будет равно CHARACTER_LIMIT
.
Чтобы проиллюстрировать, что ваше текстовое поле пусто, и вы запрашиваете вставить строку @"ABC"
в текстовое поле, вызывается ваш метод делегата. Вы создаете строку filtered
, которая правильно оценивается как пустую строку, и вы не можете дождаться выполнения строки return [string isEqualToString:filtered];
, но на самом деле вы никогда не оцениваете эту строку, потому что вы не соответствуете требованиям входа для цикла while, потому что newLength
равно 3. таким образом, простое return (newLength > CHARACTER_LIMIT ) ? NO : YES;
решает возвращаемое значение.
Если ваш CHARACTER_LIMIT
по какой-то причине равен 4, просто представьте @"ABCD"
как строку, к которой все еще применяется логика.
Вот простой пример исправления вашей функции для работы. Я опять предполагаю, что CHARACTER_LIMIT
равно 3.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSUInteger newLength = [textField.text length] + [string length] - range.length;
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));
}