2011-01-12 7 views
0

Ich habe eine UITableView mit 3 Abschnitten und jeder Abschnitt wird durch eindeutige NSFetchedResultsController gespeist.UITableView mit mehreren NSFetchedResultsControllern, die Assertionsfehler verursachen

Ich erhalte Assertionsfehler vom NSFetchedResultsController -controllerDidChangeContent, beim Einfügen, Aktualisieren ... die Tabelle.

Meine Vermutung ist Problem mit IndexPaths kommt in Methode unten, da jeder Controller nur einzelne Abschnitt (0) hat und für den Controller in Abschnitt 0 der Fehler nicht auftritt.

- (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath*)newIndexPath 
{ 
    switch(type) 
    { 
     case NSFetchedResultsChangeInsert: 
      [[self atableView] insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
      break; 
     case NSFetchedResultsChangeDelete: 
      [[self atableView] deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
      break; 
     case NSFetchedResultsChangeUpdate: 
      [self configureCell:(DashboardViewCell *) [[self atableView] cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      break; 
     case NSFetchedResultsChangeMove: 
      [[self atableView] deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [[self atableView] insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 

Also meine Frage ist, wie kann ich feststellen, welche Controller (von dem Abschnitt) wird die indexPath entsprechend verarbeitet und ändern und wenn das der richtige Weg, es zu tun? Und möglicherweise einige Beispiele für die Verwendung mehrerer nfetchedresultscontrollers mit einem uitableview.

Antwort

3

So war meine Vermutung tatsächlich richtig: (NSFetchedResultsController *) -Controller didChangeObject: (id) anObject atIndexPath: (NSIndexPath *) indexPath

wie jeder Controller

  • (void) Steuerung folgende Funktion tritt forChangeType: (NSFetchedResultsChangeType) Typ newIndexPath: (NSIndexPath *) newIndexPath

die indexPath falsch ist für jeden Regler außer dem einen, das Setup für Abschnitt ist 0.

Jeder Controller hat nur einen einzigen Abschnitt - 0 in meinem Fall, aber noch wichtiger, diese Abschnitte entsprechen nicht den Tabellenabschnitten.

So ist die Abhilfe, die ich zur Zeit umgesetzt (nicht groß, so wird wahrscheinlich überarbeiten) ist für cachename des Controllers zu überprüfen und auf der Grundlage, dass der Abschnitt ändern für indexPath/newIndexPath

etwas wie folgt aus:

if([[controller cacheName] isEqualToString:@"sectionX"]) 
{ 
    indexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:<add correct section>]; 
    newIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:<add correct section>]; 
} 
+0

Danke für die Zeitersparnis;) Ein kleiner Fehler für den 'newIndexPath'. Es sollte '[NSIndexPath indexPathForRow: newIndexPath.row inSection: ]' sein –

0

Ich bin nicht sicher, dass es der FetchedResultController ist.

Der Einsatz und der Zeilenaufruf an einem gewissen Punkt löschen wird die Tableview fragt neu zu laden, wird es dann fragt die Delegierten und Datenquelle Methoden für numberOfRowsInSection, cellForRowAtIndexPath usw.

wahrscheinlich Was passiert, ist, dass das Modell und die Tableview sind nicht synchron und der Controller löst eine Warnung aus.

[tableView beginUpdates]; 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     NSMutableDictionary *item = [self.itemList objectAtIndex:indexPath.row]; 
    // Delete the row from the data source 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     [self.itemList removeObjectAtIndex:indexPath.row];  

} 
    [tableView endUpdates]; 

so etwas wie dies versuchen, wo alle Änderungen an der Tableview und das zugrunde liegende Modell in die beginUpdates und EndUpdates gewickelt sind. Diese werden dazu führen, dass die TableView mit der Zeichnung der Zelle wartet, bis Sie das OK geben.

Wenn das oben genannte nicht der Fall ist, wie ich in der Regel mit mehreren Abschnitten in einer Tabelle arbeiten.

In Ihrer Kopfzeile deklarieren Sie eine typedef enum für die Abschnitte;

Ich habe die switch() in fast jeder Tabelle Delegate/Datenquelle Methode. Dies macht es sehr einfach herauszufinden, welcher Abschnitt verarbeitet wird und was er tut.