2012-05-14 4 views
0

Я создал пользовательский 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; 
    } 
} 

}

+0

Я бы предложил добавить NSLog после извлечения вашего NSRange и вывода текущего значения, чтобы определить, что он возвращает, и почему он находится за пределами текста текста в текстовом поле. – pdriegen

+0

Какая строка выдает ошибку? Вызывается ли код, который вы указали, для каждого введенного символа? – strings42

+0

Код запускается с помощью события управления UIControlEventEditingChanged. Поэтому да, каждый символ вводит его снова. – Fortytwo

ответ

0

мне интересно, есть ли у вас ключ правильно?

UITextField не имеет selectionRange собственность публично определена AFAICT. Однако <UITextInput> - к которому относится UITextField - имеет selectedTextRange. Возможно, это то, что вы намеревались? (Вполне возможно, что есть недокументированная частная собственность на самом деле называется selectionRange, что вы случайно столкнулись, и которая не ведет себя, как ожидается, в таких случаях, как вы столкнулись.)

В качестве альтернативы, вы на самом деле означает UITextView - который имеет selectedRange - но все же нет selectionRange?

В отдельном примечании, я не думаю, что подкласс UITextField - правильный подход здесь. Автозаполнение может быть полностью (без каламбура), реализованное с использованием методов <UITextFieldDelegate>, и это является максимальным программированием Какао, когда вы можете достичь цели с помощью классовой композиции, а не подкласса, вы должны выбирать композицию каждый раз.

+0

Хорошо, я все равно рассматривал возможность переосмысления с помощью , поэтому я только начну. Спасибо за ввод. – Fortytwo