2011-10-22 16 views
8

iOS 5 ha infine aggiunto un metodo moveRowAtIndexPath:toIndexPath: a UITableView. Il problema è che chiamarlo sposta solo la riga, non la aggiorna/ridisegna. L'unico modo per farlo sembra essere trovando la cella e chiamando setNeedsDisplay direttamente. Ma questo è difficile dal momento che non si sa mai se la cella è già stata spostata o meno.moveRowAtIndexPath non aggiorna il contenuto della cella

Non è possibile chiamare reloadRowsAtIndexPaths:, poiché non sono consentite due animazioni applicate a una singola riga all'interno dello stesso blocco beginUpdates-endUpdates.

Ci sono alcune soluzioni alternative che riesco a pensare, come dividere l'intera cosa in 2 blocchi di animazione. Ma mi chiedo se mi manchi qualcosa, perché l'intero comportamento mi sembra strano.

+0

Non sicuro, ma prova a guardare 'beginUpdates' e' endUpdates'. Potresti essere in grado di tenere traccia dell'indicePath che viene spostato e di apportare l'opportuna modifica alla cella in "endUpdates" se è stata spostata. – runmad

+0

Richiamare qualsiasi nuova funzione di animazione di riga dopo che EndUpdates annulla le animazioni in sospeso per quella cella. In altre parole, la cella viene ridisegnata ma l'animazione di spostamento non viene più eseguita. Chiamare 'setNeedsDisplay' ha un effetto simile. – samvermette

+0

Archiviato un bug report per questo: http://openradar.appspot.com/10457435 – samvermette

risposta

14

finalmente ricevuto una risposta ufficiale da parte di Apple per quanto riguarda questo problema:

Engineering ha stabilito che questo problema si comporta come previsto in base sulle seguenti informazioni:

Solo inserimento e aggiornamento causa la cellula di essere richiesto dall'origine dati (il primo perché è nuovo e il secondo perché hai detto esplicitamente alla vista tabella per aggiornare la cella) . Elimina e sposta non aggiornare il contenuto perché non è implicito nell'azione eseguita. Se è necessario modificare il contenuto della cella durante l'aggiornamento, basta raggiungere la cella e modificare i contenuti.

2

loro piace il che rende difficile per noi non è vero ;-)

case NSFetchedResultsChangeUpdate: 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
     break; 

    case NSFetchedResultsChangeMove: 
     // old API 
     //[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     //[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

     // new API 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:newIndexPath]; // note use of newIndexPath 
     [tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; // NS_AVAILABLE_IOS(5_0); 
     break; 

Nota nel ChangeMove, configureCell ha diverse params rispetto al suo utilizzo in ChangeUpdate quindi fate attenzione se copia incolla. Piuttosto complicato per farlo bene.

Problemi correlati