2011-12-01 18 views
10

Sto cercando di implementare un AQGridView che utilizza un controller di risultati recuperato come origine dati.AQGridView supportato da un NSFetchedResultsController

Non sono particolarmente sicuro di come gestire i metodi delegati NSFetchedResultsController utilizzando la visualizzazione griglia; ovvero i contenuti che cambiano. Capisco come utilizzare il FRC per gli altri delegati dell'origine dati della vista griglia.

Qualcuno potrebbe indicarmi la giusta direzione?

+0

vedo che ci sono InsertItemAtIndicies/metodi DeleteItemAtIndicies che vengono forniti, ma prendere un indice set. Forse la domanda è come tradurre un indexPath in un indexSet? –

+0

Giusto per dire prima di continuare: AQGridView presenta limiti molto stupidi all'aggiornamento delle celle di gridView e in particolare del conteggio della griglia. Devi aggiornare completamente la tua origine dati PRIMA che vengano apportate modifiche alla griglia, altrimenti attiva un'eccezione integrata. – CodaFi

risposta

7

Il risultato dovrebbe essere un po 'simile a questa:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    [gridView beginUpdates]; 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo 
     atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
{ 
    switch(type) 
    { 
    case NSFetchedResultsChangeInsert: 
     break; 
    case NSFetchedResultsChangeDelete: 
     break; 
    } 
} 

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

    ChannelPageViewController *currentPageController, *destinationPageController; 

    NSIndexSet * indices = [[NSIndexSet alloc] initWithIndex: indexPath.row]; 
    NSIndexSet *newIndices = [[NSIndexSet alloc] initWithIndex:newIndexPath.row]; 

    switch(type) { 
     case NSFetchedResultsChangeInsert: 
     [gridView insertItemsAtIndices:newIndices withAnimation:AQGridViewItemAnimationNone]; 
     break; 

     case NSFetchedResultsChangeDelete: 
     [gridView deleteItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone]; 
     break; 

     case NSFetchedResultsChangeUpdate: 
     [gridView reloadItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone]; 
     break; 

     case NSFetchedResultsChangeMove: 
     [gridView deleteItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone]; 
     [gridView insertItemsAtIndices:newIndices withAnimation:AQGridViewItemAnimationNone]; 
     break; 
    } 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    [gridView endUpdates]; 
    if ([[frc fetchedObjects] count] == 1) { 
    [gridView reloadData]; 
    } 

} 
-1

Quando i cambiamenti di contenuto che fanno un

[self.gridView reloadData]; 

o qualcosa di simile nel tuo caso. È esattamente lo stesso di un tableview.

+0

Sì, l'ho capito, anche se cercavo un modo per utilizzare i metodi di inserimento/cancellazione per sfruttare le animazioni disponibili. L'uso di un 'reloadData' fa apparire magicamente le cose. –

+0

quindi puoi contrassegnare questa risposta come corretta. Ti darà anche la reputazione. – Chrizzz

0

Poiché AQGridView non ha sezioni, il modo migliore per gestirlo sarebbe implementare i metodi delegati di NSFethcedresultscontroller e ignorare qualsiasi codice per i casi relativi alle sezioni aggiornate. Assicurati inoltre di inizializzare fetchrequest senza sectionNameKeyPath.

Poi basta seguire il modello normale per l'aggiornamento le righe, ma utilizzando NSIndexSet invece di NSIndexPath e InsertItemAtIndicies/DeleteItemAtIndicies invece di insertRowAtIndexPath/deleteRowAtIndexPath

mi sto muovendo il mio AQGridView a CoreData ora, quindi mi inviare eventuali aggiornamenti alla mia risposta, non appena ho finito ...

Problemi correlati