NSFetchedResultsController objectAtIndex, objectAtIndexPath, indexPathForObject Inkonsistenzen

Ich habe einen geholt Ergebnis mit einem einzelnen Abschnitt. Ich bin in der Lage, den Zugriff auf die Objekte mit [[fetchedResultsController fetchedObjects] objectAtIndex:index] für alle Objekte. Aber es versagt, wenn ich objectAtIndexPath wie diese: [fetchedResultsController objectAtIndexpath:indexPath]

Tritt ein Fehler auf, nachdem ich das einfügen einer Zeile (für einen der SearchResult-Objekten) in die entsprechende Tabelle. Erscheint das Objekt eingefügt werden, in die neue Tabelle richtig. Nachdem ich visuell bestätigt dies, ich wählen Sie eine der Zeilen, und dann beginnt der Spaß.

Hier ist der code wo die Fehler Auftritt:

- (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];
}

Habe ich einen Fehler in der letzten Zeile. Das Protokoll sieht wie folgt aus:

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]

Nach Ausführung der NSLog-Anweisungen, bekomme ich eine exception in der letzten Zeile mit [fetchedResultsController objectAtIndexPath:indexPath]. Es geschieht für die anderen index-Werte zu, aber Sie sehen immer gültig.

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

Also, um es zusammenzufassen, es scheint die richtige Anzahl der abgerufenen Objekte, es gibt einen Abschnitt (0), auf die ich zugreifen kann jeweils von einer Methode, nicht aber von dem anderen. Die indexPathForObject: ist immer die Rückkehr (null).

Ist das ein bug oder bin ich Missverständnis, was?


UPDATE

Hier ist der code, der Umsetzung der NSFetchedResultsControllerDelegate Protokoll-Methoden.

- (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

Ich weiß nicht, ob es eine Rolle spielt, aber der tableView wird initialisiert mit dieser Zeile:

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

UPDATE 3

Wenn ich die betreffende Zeile wie folgt, funktioniert es einwandfrei. Aber ich würde lieber halten Sie die Indizierung die gleiche, wie Sie es mit der Tabelle.

//SearchResult *result = [self.fetchedResultsController objectAtIndexPath:indexPath];
SearchResult *result = [[self.fetchedResultsController fetchedObjects] objectAtIndex:[indexPath indexAtPosition:1]]
  • wie haben Sie das Objekt einfügen? Können Sie nach dem code, wo Sie hinzufügen, die das Objekt für Ihre wichtigsten Daten speichern und fügen Sie die Zeile der tableView?
  • Aktualisiert. Siehe oben.
  • sind Sie tatsächlich etwas Hinzugefügt, was zu den Kern-Daten Speichern oder nur das hinzufügen einer Zeile der tableView?
  • Ja, ich weiß speichern in der managed-object-Kontext, wenn ich änderungen vornehmen. Das ist, was löst die Aufrufe der NSFetchedResultsControllerDelegate Protokoll-Methoden.
  • Wenn Sie eine Antwort haben, die Antwort sollte nicht eingefügt werden in die Frage, aber in eine Antwort und dann ausgewählt.
  • Hi @Jim ich weiß, das ist ein ziemlich Alter post, aber hast du eine bessere Lösung als der Aufruf [[self.fetchedResultsController fetchedObjects] objectAtIndex:...] ?

InformationsquelleAutor Jim | 2011-11-05
Schreibe einen Kommentar