8

Mam pobrane wyniki z jednej sekcji. Mogę uzyskać dostęp do obiektów przy użyciu [[fetchedResultsController fetchedObjects] objectAtIndex:index] dla wszystkich obiektów. Ale zawodzi, gdy używam objectAtIndexPath w ten sposób: [fetchedResultsController objectAtIndexpath:indexPath]NSFetchedResultsController objectAtIndex, objectAtIndexPath, indexPathForObject niespójności

Błąd pojawia się po wstawieniu wiersza (dla jednego z obiektów SearchResult) do odpowiedniej tabeli. Obiekt wydaje się być poprawnie wstawiony do nowej tabeli. Po potwierdzeniu tego, wybieram jeden z wierszy, a następnie zaczyna się zabawa.

Oto kod gdzie błąd występuje:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SearchResult *event; 
    NSLog(@"Number of sections in fetchedResultsController: %d", [[fetchedResultsController sections] count]); 
    for (NSUInteger i=0; i<[[fetchedResultsController fetchedObjects] count]; i++) { 
     event = (SearchResult*)[[fetchedResultsController fetchedObjects] objectAtIndex:i]; 
     NSLog(@"object at index[%d]: %@", i, event.title); 
     NSLog(@"indexPath for object at index[%d]:%@", i, [fetchedResultsController indexPathForObject:event]); 
    } 

    NSLog(@"indexPath passed to method: %@", indexPath); 

    SearchResult *result = [fetchedResultsController objectAtIndexPath:indexPath]; // *** here is where the error occurs *** 

    [viewDelegate getDetails:result]; 
} 

Mam awarię w ostatnim wierszu. Log wygląda tak:

Number of sections in fetchedResultsController: 1 
object at index[0]: Cirles 
indexPath for object at index[0]:(null) 
object at index[1]: Begin 
indexPath for object at index[1]:(null) 
object at index[2]: Copy 
indexPath for object at index[2]:(null) 
object at index[3]: Unbound 
indexPath for object at index[3]:(null) 
indexPath passed to method: <NSIndexPath 0x64ddea0> 2 indexes [0, 2] 

Po wykonaniu sprawozdania NSLog, otrzymuję wyjątek w ostatnim wierszu używając [fetchedResultsController objectAtIndexPath:indexPath]. Zdarza się też dla innych wartości indeksu, ale zawsze wyglądają one poprawnie.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no object at index 2 in section at index 0'

Tak więc, aby podsumować, nie wydaje się być w porządku liczba idących obiektów, jest jedna sekcja (0), mogę przejść przez każdy jeden sposób, ale nie przez innych. IndexPathForObject: zawsze zwraca (null).

Czy to błąd, czy coś nie rozumiem?


UPDATE

Oto kod realizacji sposobów protokołu NSFetchedResultsControllerDelegate.

- (void) controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    NSLog(@"Favorites controllerWillChangeContent"); 
    [self.tableView beginUpdates]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    NSLog(@"Favorites Table controllerDidChangeContent"); 
    [self.tableView endUpdates]; 
} 

- (void)controller:(NSFetchedResultsController *)controller 
    didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath 
    forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath { 

    NSLog(@"Favorites Changed Object"); 

    switch (type) { 
     case NSFetchedResultsChangeInsert: 
      NSLog(@"--- Favorite was inserted"); 
      if ([[self.fetchedResultsController fetchedObjects] count] == 1) { 
       // configure first cell to replace the empty list indicator by first deleting the "empty" row 
       [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 
      } 

      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 

      break; 

     case NSFetchedResultsChangeDelete: 
      NSLog(@"--- Favorite was deleted"); 

      [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
      if ([[self.fetchedResultsController fetchedObjects] count] == 0) { 
       // configure first cell to show that we have an empty list 
       [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
      } 

      break; 

     case NSFetchedResultsChangeMove: 
      NSLog(@"--- Favorite was moved"); 

      break; 

     case NSFetchedResultsChangeUpdate: 
      NSLog(@"--- Favorite was updated"); 
      [self configureCell:(ResultCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 

      break; 

     default: 
      break; 
    } 

} 

- (void)controller:(NSFetchedResultsController *)controller 
    didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo 
      atIndex:(NSUInteger)sectionIndex 
    forChangeType:(NSFetchedResultsChangeType)type { 

    switch (type) { 
     case NSFetchedResultsChangeInsert: 
      NSLog(@"Favorites Section Added"); 

      break; 

     case NSFetchedResultsChangeDelete: 
      NSLog(@"Favorites Section Deleted"); 

      break; 

     default: 
      break; 
    } 

} 

UPDATE 2

ja nie wiem, czy to ważne, ale tableView jest inicjowany z tej linii:

tableView = [[UITableView alloc] initWithFrame:CGRectMake(...) style:UITableViewStyleGrouped]; 

UPDATE 3

Kiedy zmienię linię naruszającą w następujący sposób, to działa jest w porządku. Ale wolałbym, aby indeksowanie było takie samo jak w przypadku stołu.

//SearchResult *result = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
SearchResult *result = [[self.fetchedResultsController fetchedObjects] objectAtIndex:[indexPath indexAtPosition:1]] 
+0

jak wstawiłeś obiekt? Czy możesz umieścić kod, w którym dodajesz obiekt do głównej składnicy danych i dodać wiersz do swojego tableView? – timthetoolman

+0

Zaktualizowano. Patrz wyżej. – Jim

+0

czy faktycznie dodajesz coś do Core Data Store lub po prostu dodajesz wiersz do tableView? – timthetoolman

Odpowiedz

0

Miałem ten sam problem teraz.

Dla mnie pomógł zainicjować NSFetchedResultsController z cacheName: nil.

Powiązane problemy