У меня есть UISearchBar, подключенный для перезагрузки AQGridView при вводе текста.Но, что удивительно, существует ограничение на количество символов, которые могут быть введены в строку поиска, пока NSRangeException
не убьет мое приложение.После ввода 11-го символа, введенного в строку поиска, появляется сообщение NSRangeException
с этим сообщением:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSPathStore2 getCharacters:range:]: index (11) beyond bounds (11)'
*** First throw call stack:
(0x261b052 0x27acd0a 0x25c3a78 0x25c39e9 0x1aded12 0x252498e 0x25369b3 0x1ae020b 0x1ae00f0 0x2a367 0x14204b2 0x261cec9 0x11ed515 0x129372f 0x1292e1e 0x129fce9 0x12ac12a 0x1b9ea39 0x25e6885 0x25e67a8 0x1ae31aa 0x6f6b8e7 0x6376917 0x673a111 0x673d4e1 0x6f4685b 0x6f492e3 0x6f49440 0x6f4a09f 0x674584d 0x6745b32 0x6759e12 0x6cbf0f7 0x6758245 0x67571f2 0x67578fb 0x6cbeca4 0x676c64e 0x675a0a0 0x673ca0a 0x63a7ad9 0x261ce72 0x6f665bc 0x63ce7f9 0x63d087f 0x138ae03 0x134fb9b 0x134f62b 0x134e6b6 0x1357f09 0x11f9406 0x12d714a 0x12d714a 0x12d714a 0x12d714a 0x12d714a 0x12d714a 0x12d714a 0x12d714a 0x12d714a 0x12d714a 0x12d714a 0x11f9460 0x11f90c5 0x11f91f8 0x11ecaa9 0x29aefa9 0x25ef1c5 0x2554022 0x255290a 0x2551db4 0x2551ccb 0x29ad879 0x29ad93e 0x11eaa9b 0x20ed 0x2065)
terminate called throwing an exception
Эта ошибка, очевидно, происходит из метода делегата UISearchBar -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
, так что вот всеМетод:
ОБНОВЛЕНИЕ 1: Новый код.Я просто прервал цикл for, если текст был длиннее, чем название продукта, но это ничего не исправило, это всего лишь обходной путь.
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
/*
Update the filtered array based on the search text and scope.
*/
[copyListOfItems removeAllObjects]; // First clear the filtered array.
/*
Search the main list for products whose type matches the scope (if selected) and whose name matches searchText; add items that match to the filtered array.
*/
if (!searchText.length) {
isSearching = NO;
[filterControl setSelectedSegmentIndex:0];
[filterControl setEnabled:YES];
[self.gridView reloadData];
}
else {
[filterControl setSelectedSegmentIndex:0];
[filterControl setEnabled:NO];
isSearching = YES;
for (NSString *product in _documentIconsURLs)
{
if (searchText.length >= [[product lastPathComponent]length])
break;
NSComparisonResult result = [[product lastPathComponent] compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame)
{
[copyListOfItems addObject:[product lastPathComponent]];
[copyListOfItems sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];
}
}
[self.gridView reloadData];
}
}
Глобальная точка прерывания исключения показывает, что эточасть кода выдает исключение:
NSComparisonResult result = [[product lastPathComponent] compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
Итак, мой вопрос: почему 11 символов выдают исключение диапазона?Можно ли это исправить?