Я заставляю свой UISearchBar работать, и я заметил, что если я наберу слово, просто ОДИН, содержащийся в большем количестве контроллеров (например, «a»), и выберу строку, я получу неожиданный сбой. Если я ищу больше слова, оно работает, даже если оно содержится в более чем 1 контроллере.
Я получаю исключение NSRangeException:
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSArray objectAtIndex:]: index 9 beyond bounds [0 .. 8]'
в строке
cellValue = [array objectAtIndex:indexPath.row];
моего кода (у меня есть 3 раздела)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
//Get the nib
NSString *cellValue = nil;
if(searching)
cellValue = [copyListOfItems objectAtIndex:indexPath.row];
else {
NSDictionary *dictionary =[listaOggetti objectAtIndex:indexPath.row];
NSArray *array = [dictionary objectForKey:@"Elementi"];
cellValue = [array objectAtIndex:indexPath.row];
}
NSDictionary *dict = [listaOggetti objectAtIndex:indexPath.section];
NSArray *array = [dict objectForKey:@"Elementi"];
cellValue = [array objectAtIndex:indexPath.row] ; //here's the error
if (indexPath.section == 0)
{
if ([cellValue isEqual: @"FirstNib"]){
FIrstViewController *firstController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
[self.navigationController pushViewController:appsController animated:YES];
[firstController release];
if ([cellValue isEqual: @"SecondNib"]){
secondViewController *secondController = [[SecondViewController alloc] initWithNibName:@"secondViewController" bundle:nil];
[self.navigationController pushViewController:secondController animated:YES];
[secondController release];
}
//and so on
}
if (indexPath.section == 1){
if ([cellValue isEqual: @"ThirdNib"]){
ThirdViewController *firstController = [[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil];
[self.navigationController pushViewController:ThirdController animated:YES];
[ThirdController release];
}
//and so on
}
if (indexPath.section == 2) {
if ([cellValue isEqual @"FourthNib"]){
FourthViewController *firstController = [[FourthViewController alloc] initWithNibName:@"FourthViewController" bundle:nil];
[self.navigationController pushViewController:FourthController animated:YES];
[FourthController release];
}
}
(строка не в состоянии IF)
Теперь. Я знаю, что он перебирает массив, пытаясь получить доступ к 10-му элементу.
Передав мышку по строке «массив» здесь
cellValue = [array objectAtIndex:indexPath.row] ;
Он говорит мне, что на нем 9 объектов, а должно быть 45, как я их здесь объявил, для ключа @ "Elementi":
- (void)viewDidLoad {
[super viewDidLoad];
listaOggetti = [[NSMutableArray alloc] init];
NSArray *arrayDesk = [NSArray arrayWithObjects: @"First",@"Second",@"Third"..@"9th", nil];
NSArray *sortedDesk = [arrayDesk sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSDictionary *dictDesk = [NSDictionary dictionaryWithObject:sortedDesk forKey:@"Elementi"];
NSArray *arrayLion = [NSArray arrayWithObjects:@"First1",@"Second1" ... @"30th", nil];
NSArray *sortedLion = [arrayLion sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSDictionary *dictLion = [NSDictionary dictionaryWithObject:sortedLion forKey:@"Elementi"];
NSArray *arrayRestore = [NSArray arrayWithObjects:@"First2",@"Second2" ... @"6th", nil];
NSArray *sortedRestore = [arrayRestore sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSDictionary *dictRest = [NSDictionary dictionaryWithObject:sortedRestore forKey:@"Elementi"];
[listaOggetti addObject:dictDesk];
[listaOggetti addObject:dictLion];
[listaOggetti addObject:dictRest];
copyListOfItems = [[NSMutableArray alloc] init];
self.navigationItem.title = NSLocalizedString(@"TIPS", @"Tips");
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"window.png"]];
//Add the search bar
self.tableView.tableHeaderView = searchBar;
searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
searching = NO;
letUserSelectRow = YES;
CGRect bounds = self.tableView.bounds;
bounds.origin.y = bounds.origin.y + searchBar.bounds.size.height;
self.tableView.bounds = bounds;
}
Разве он не видит все объекты для ключа @"Elementi"
? Я нахожусь на этом от дней, я не могу понять, как решить, хотя.
Любая помощь приветствуется
* РЕДАКТИРОВАТЬ *
Я заметил, что
NSDictionary *dict = [listaOggetti objectAtIndex:indexPath.section];
имеет только 9 элементов, как и в первом массиве, но у меня есть 3 словаря: dictDesk, dictLion, dictRest.
Как мне выбрать все 45 элементов в NSDictionary?
* РЕДАКТИРОВАТЬ 2 *
Благодаря pengOne я наконец-то заполнил глобальный массив своими 45 элементами, таким образом
NSMutableArray *allObjects = [[NSMutableArray alloc] init];
[allObjects addObjectsFromArray:[[listaOggetti objectAtIndex:0] objectForKey:@"Elementi"]];
[allObjects addObjectsFromArray:[[listaOggetti objectAtIndex:1] objectForKey:@"Elementi"]];
[allObjects addObjectsFromArray:[[listaOggetti objectAtIndex:2] objectForKey:@"Elementi"]];
Теперь все, что мне нужно сделать, это адаптировать что-то вроде этого
NSDictionary *dictionary =[listaOggetti objectAtIndex:indexPath.row];
NSArray *array = [dictionary objectForKey:@"Elementi"];
cellValue = [array objectAtIndex:indexPath.row];
к глобальному массиву, который я сделал, так что он может позволить мне искать и выбирать содержимое, либо из tableView и SearchView.