Сбой приложения при поиске ОДНОГО слова - PullRequest
1 голос
/ 17 августа 2011

Я заставляю свой 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.

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Ошибка говорит вам, что вы отправляете это сообщение:

[array objectAtIndex:9];

, когда array имеет 9 объектов, и оно отвечает только на

[array objectAtIndex:0];
...
[array objectAtIndex:8];

Строки, которые вам нужнорасследуются следующие вопросы:

    NSArray *array = [dictionary objectForKey:@"Elementi"];
    selectedRow = [array objectAtIndex:indexPath.row];

Проверка [dictionary objectForKey:@"Elementi"].Похоже, что это NSArray с 9 объектами, тогда как для доступа к объекту с индексом 10 требуется NSArray как минимум с 10 объектами.


Для вашего viewDidLoadметод, мне кажется, что listaOggetti это NSMutableArray с 3 объектами: dictDesk имеет 9 элементов, dictLion имеет 30 элементов и dictRest имеет 6 элементов.

Чтобы исправить эту ошибку, вам нужно изменить количество строк в разделе 0 на 9, количество строк в разделе 1 на 30 и количество строк в разделе 2 на 6.

1 голос
/ 20 августа 2011
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {   
        NSString* cellValue=@"";
        if (searching)
            cellValue = [copyListOfItems objectAtIndex:indexPath.row];
        else{
             NSDictionary *dictionary = [listaOggetti objectAtIndex:indexPath.section];
             NSArray *array = [dictionary objectForKey:@"Elementi"];
             cellValue = [array objectAtIndex:indexPath.row];
       }
       if ([cellValue isEqual: @"Apps on specific Desks"] || [cellValue isEqual: @"Applicazioni su più Scrivanie"]){

        AppsViewController *appsController = [[AppsViewController alloc] initWithNibName:@"AppsViewController" bundle:nil];
        [self.navigationController pushViewController:appsController animated:YES]; 
        [appsController release];
    }

}
...