2014-01-29 3 views
0

Я пытаюсь реализовать searchResultsTableView, который перезагрузит таблицу на основе поиска пользователя. В функции numberOfRowsInSection, которую я знаю, бросает мне исключение, у меня есть следующий:Ошибка за пределами непустого массива - что происходит?

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (tableView == self.tableView) { 
     return self.objects.count; 
    } else { 
     NSLog(@"The count of self.searchresults is %i", self.searchResults.count); //Shows as non-zero 
     return self.searchResults.count; 
    } 

} 

Что я смущен, что я поставил точку останова права перед return заявлением, и я знаю, что я получаю не -0 результатов, основанных на NSLog. Сразу же после возвращения числа, отличного от 0, исключение исключается, и я получаю исключение «индекс 0 за пределами для пустого массива»

Что я делаю неправильно?

Я также уверен, чтобы перезагрузить таблицу только вручную, поэтому в shouldReloadTableForSearchString, у меня есть следующий метод:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 

    if (searchString.length > 3){ 
     [self.searchResults removeAllObjects]; 

     PFQuery *query = [PFUser query]; 
     [query whereKey:@"username" containsString:searchString]; 

     [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
      if (error){ 
       NSLog(@"There is an error"); 
      } else { 
       [self.searchResults addObjectsFromArray:objects]; 
       NSLog(@"self.resultResults count %i", self.searchResults.count); 
       NSLog(@"The objects are %@", self.searchResults); 
       [self.searchDisplayController.searchResultsTableView reloadData]; 
      } 
     }]; 

    } 
    return NO; 
} 

Спасибо!

+0

Что такое код, который получает доступ к массиву? Скорее всего, в 'RowForIndexPath:' – Evan

+0

Добавить контрольную точку исключения. Вкладка «Точки останова», плюс знак внизу. – danh

+0

Я добавил контрольную точку исключения для всех исключений, а также точку останова прямо в 'tableView cellForRowAtIndexPath:'. Я узнал, что 'cellForRowAtIndexPath' фактически не вызывается вообще. Есть ли какой-либо метод tableview, вызываемый по имени 'numberOfRowsInSection'? – daspianist

ответ

0

Попробуйте это

Измените ваш searchDisplayController: на

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 

    if (searchString.length > 3){ 

     PFQuery *query = [PFUser query]; 
     [query whereKey:@"username" containsString:searchString]; 

     [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
      if (error){ 
       NSLog(@"There is an error"); 
      } else { 
       [self.searchResults setArray:objects]; 
       NSLog(@"self.resultResults count %i", self.searchResults.count); 
       NSLog(@"The objects are %@", self.searchResults); 
       [self.searchDisplayController.searchResultsTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 
      } 
     }]; 

    } 
    return NO; 
} 
+0

Спасибо за предложение. К сожалению, даже избавившись от метода removeAllObjects и установив Array в качестве объектов исследования, я все равно получаю исключение. Исключение выдается, когда массив имеет> 0 элементов. – daspianist

+0

попробуйте перезагрузить таблицу в основном потоке, '[self.searchDisplayController.searchResultsTableView выполняетSelectorOnMainThread: @selector (reloadData) withObject: nil waitUntilDone: NO];' – Akhilrajtr

1

Вроде бы приложение не врезаться в

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

Проверьте, где бы вы вызываете objectAtIndex: метод и посмотреть если вы вызываете недопустимый индекс.

+0

Я думаю, что вы правы - это когда я возвращаю не-номер, в результате чего я стал исключением. – daspianist

0
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 

    if (searchString.length > 3){ 
     if(self.searchResults){ 
      [self.searchResults release]; 
      self.searchResults=nil; 
     } 

     // [self.searchResults removeAllObjects]; 

     PFQuery *query = [PFUser query]; 
     [query whereKey:@"username" containsString:searchString]; 

     [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
      if (error){ 
       NSLog(@"There is an error"); 
      } else { 
       // [self.searchResults addObjectsFromArray:objects]; 
       self.searchResults=[[NSMutableArray alloc] initWithArray:objects]; 

       NSLog(@"self.resultResults count %i", self.searchResults.count); 
       NSLog(@"The objects are %@", self.searchResults); 
       [self.searchDisplayController.searchResultsTableView reloadData]; 
      } 
     }]; 

    } 
    return NO; 
} 

Вместо [self.searchResults removeAllObjects]; использования

if(self.searchResults){ 
      [self.searchResults release]; 
      self.searchResults=nil; 
     } 

и заменить:

[self.searchResults addObjectsFromArray:objects]; 

с

self.searchResults=[[NSMutableArray alloc] initWithArray:objects]; 
+0

Я боюсь, что это не сработало. Когда self.searchResults возвращал 0, он работал нормально ... но когда его ненулевой, я получаю исключение. – daspianist

Смежные вопросы