2014-04-03 2 views
5

Ho un problema con la mia barra di ricerca che ho aggiunto nel mio ViewController.UITableView dataSource deve restituire la cella da tableView: cellForRowAtIndexPath

Sto ottenendo il seguente errore:

Assertion failure in -[UISearchResultsTableView _configureCellForDisplay:forIndexPath:], /SourceCache/UIKit/UIKit-2935.137/UITableView.m:6509 
2014-04-03 18:08:24.355 MyFood[6405:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 

configureCell:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {   
    // ToDos *toDo = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    if (viewMode==AlphabeticalOrder) { 
     Inventory *toDo=nil; 
     if (self.searchDisplayController.isActive) { 
      toDo = [searchResults objectAtIndex:indexPath.row]; 
     } else { 
      toDo=[inventoryProducts objectAtIndex:indexPath.row]; 
     } 
     cell.textLabel.text = toDo.inventoryProductName; 
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateStyle:NSDateFormatterShortStyle]; 
     NSDate *dt = toDo.expireDate; 
     NSString *dateAsString = [formatter stringFromDate:dt]; 
     cell.detailTextLabel.text = [NSString stringWithFormat:@"Until: %@", dateAsString]; 
    } else { 
     Inventory *toDo=nil; 
     if (self.searchDisplayController.isActive) { 
      NSDictionary *sectionDict=[searchResults objectAtIndex:indexPath.section]; 
      NSArray *sectionData=[sectionDict objectForKey:@"SECTION_DATA"]; 
      toDo = [sectionData objectAtIndex:indexPath.row]; 
     } else { 
      NSDictionary *sectionDict=[inventoryProducts objectAtIndex:indexPath.section]; 
      NSArray *sectionData=[sectionDict objectForKey:@"SECTION_DATA"]; 
      toDo=[sectionData objectAtIndex:indexPath.row]; 
     } 
     cell.textLabel.text = toDo.inventoryProductName; 
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateStyle:NSDateFormatterShortStyle]; 
     NSDate *dt = toDo.expireDate; 
     NSString *dateAsString = [formatter stringFromDate:dt]; 
     cell.detailTextLabel.text = [NSString stringWithFormat:@"Until: %@", dateAsString]; 
    } 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // Configure the cell. 
    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 

} 

codice barra di ricerca:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
    { 
     if (searchText.length!=0) { 
      if (viewMode==AlphabeticalOrder) { 
       NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 
       //   [searchResults removeAllObjects]; 
       //   [searchResults addObjectsFromArray:[inventoryProducts filteredArrayUsingPredicate:resultPredicate]]; 
       searchResults=[inventoryProducts filteredArrayUsingPredicate:resultPredicate]; 
      } else { 
       //-section mode 
       NSMutableArray *newDataArray=[NSMutableArray array]; 
       for (NSMutableDictionary *aSectionDict in inventoryProducts) { 
        NSArray *sectionData=(NSArray*)[aSectionDict objectForKey:@"SECTION_DATA"]; 
        NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 
        NSArray *filteredArray=[sectionData filteredArrayUsingPredicate:resultPredicate]; 
        NSDictionary *sectionDataModified=[NSDictionary dictionaryWithObjectsAndKeys:filteredArray,@"SECTION_DATA",[aSectionDict objectForKey:@"SECTION_TITLE"],@"SECTION_TITLE", nil]; 
        [newDataArray addObject:sectionDataModified]; 
       } 
       searchResults=[NSArray arrayWithArray:newDataArray]; 
      } 
     } 
    } 

    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
    { 
     [self filterContentForSearchText:searchString 
            scope:[[self.searchDisplayController.searchBar scopeButtonTitles] 
              objectAtIndex:[self.searchDisplayController.searchBar 
                 selectedScopeButtonIndex]]]; 

     return YES; 
    } 

qualcuno può aiutare?

risposta

0

Questo sta dicendo che il tuo metodo: cellForRowAtIndexPath restituisce una cella che è nulla. Che genera questo errore.

Questa riga qui: UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

Will essere nill, dal momento che non assegna nulla per cella, né di fare qualsiasi cosa con esso.

+0

Stai assumendo che non sta usando le cellule prototipo di cui uno storyboard (che è l'ipotesi più sicuro data la fatti in mano) –

+0

ma l'errore si apre quando tocco sulla barra di ricerca, tabella normaleVisualizzazione del contenuto nella vista – user3450607

+0

io uso le celle del prototipo – user3450607

5

Quando si utilizza un UISearchDisplayController, i risultati vengono visualizzati in un UITableView separato che utilizza il controller di visualizzazione originale come delegato e origine dati. Dal momento che UITableView non è impostato nello storyboard (è creato e caricato dinamicamente) non ha accesso alle celle del prototipo. Sono stato in grado di ottenere un esempio simile di lavorare utilizzando:

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

Sono un po 'preoccupato che da quando si sta chiedendo un Tableview per creare cellule da utilizzare in un diverso vista tabella.

Sembra che l'approccio migliore sarà quello di non creare le celle come celle prototipo, ma invece di crearle e caricarle da un file pennino separato.

Si consiglia inoltre di leggere i documenti per UISearchDisplayController in quanto vi sono molti altri dettagli dei protocolli Data source e delegati che devono essere aggiornati per riflettere il fatto che ci sono più visualizzazioni di tabelle in riproduzione.

14

Dal momento che è stata aggiunta una barra di ricerca, è necessario verificare se la cella non è nullo:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

// This is added for a Search Bar - otherwise it will crash due to 
//'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 
if (!cell) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

    // Configure the cell. 
    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 

} 
+0

Questa risposta ha funzionato per me. Grazie! – Leandro