Я создал пользовательский UITextField, который сравнивает вход пользователя с записями базы данных. Все работает отлично, пока пользователь не помещает пробел в текстовое поле после того, как я уже что-то предложил. Это разбивает приложение со следующим сообщением:Autocompleting UITextField crashes app
, истекающим приложение из-за неперехваченное исключение «NSRangeException», причина: «* - [__ NSCFConstantString substringToIndex]: Диапазон или индекс вне границ»
Вот код:
NSRange cursorRange = [[self valueForKey:@"selectionRange"] rangeValue];
NSString *entered = [self.text substringToIndex:cursorRange.location];
if (![self.text isEqualToString:entered]) {
self.text = entered;
return;
}
NSString *suggestedSuffix;
for (NSString *name in filterData) {
if (name.length > cursorRange.location && [[name lowercaseString] hasPrefix:entered]) {
suggestedSuffix = [name substringFromIndex:cursorRange.location];
NSMutableString *suggestedString = [[NSMutableString alloc] initWithString:entered];
[suggestedString appendString:suggestedSuffix];
self.text = suggestedString;
[self setValue:[NSValue valueWithRange:cursorRange] forKey:@"selectionRange"];
return;
}
}
}
Я бы предложил добавить NSLog после извлечения вашего NSRange и вывода текущего значения, чтобы определить, что он возвращает, и почему он находится за пределами текста текста в текстовом поле. – pdriegen
Какая строка выдает ошибку? Вызывается ли код, который вы указали, для каждого введенного символа? – strings42
Код запускается с помощью события управления UIControlEventEditingChanged. Поэтому да, каждый символ вводит его снова. – Fortytwo