2009-05-08 2 views
5

Alcuni aiuti sarebbero molto apprezzati qui!UITableView problema di aggiornamento della cella su riorganizzare

Ho una cella UITableView personalizzata, costituita da un'immagine (verde, arancione o rossa) e due etichette con dimensioni di carattere diverse. UITableView è guidato da un NSMutableArray di oggetti.

UITableView è diviso in tre sezioni, con la prima sezione contenente tutte le celle con l'immagine rossa, la seconda con l'arancione, la terza con il verde.

Ho implementato la capacità di riorganizzare le celle all'interno di UITableView, consentendo all'utente di trascinare, diciamo, un oggetto con un'immagine rossa dalla sezione rossa nella sezione arancione. Questo trascinamento funziona alla grande e i dati sottostanti vengono aggiornati correttamente. So che questo è il caso perché se seleziono la cella, vado alla sua vista di dettaglio e i dati vengono aggiornati.

Tuttavia, UITableView non si aggiorna fino a quando non vado al dettaglio (o non esce dall'app) e ritorno! Si aggiorna anche se faccio scorrere la cella incriminata fuori dalla vista e torna di nuovo in vista, quindi l'array contiene chiaramente i dati corretti. Non riesco proprio ad attivare un aggiornamento della vista!

Ho provato quanto segue dopo il mio codice per modificare i dati sottostanti in moveRowAtIndexPath:

[self.tableView reloadData]; 

Tuttavia, questo provoca un'eccezione. L'Apple Language Reference infatti dice che reloadData non può essere chiamato quando si inserisce, si elimina o si anima, il che è ovviamente quello che sto facendo. Inoltre, cercando solo per aggiornare la cella con

[self setNeedsDisplay]; 

non funziona (anche se non va in crash o).

Qualche idea su come posso aggiornare UITableView? Non riesco a trovare un afterMoveHasBeenCompleted: metodo o altro, quindi se non riesco a chiamare reloadData durante il mio moveRowAtIndexPath: metodo allora dove lo chiamo ?!

risposta

4

Trovato !!

Ho scoperto che la soluzione era quella di inserire un ritardo nel codice di aggiornamento, che lo bloccava dall'arresto anomalo.

ho messo la chiamata reloadData in un metodo separato:

- (void)refreshDisplay:(UITableView *)tableView { 
[tableView reloadData]; } 

e poi chiamarono con un secondo di ritardo 0.5:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5]; 

E non è precipitato e invece rinfrescati! Il ritardo di 0,5 secondi è appena visibile e totalmente accettabile.

Spero che questo aiuti qualcun altro!

Grazie

Phil

+3

O è solo uno sporco trucco? Esiste un metodo "animationComplete" posso usare al posto ... – h4xxr

+0

Questo sembra essere il modo migliore per farlo, come da post di gpmoore su questo thread Apple Developer:? Http://discussions.apple.com/thread.jspa ? messageID = 8450874 – Tim

+0

Questo è frustrante ma molto rassicurante! Grazie! – h4xxr

2

Dai un'occhiata al riferimento per UITableViewDelegate. Se assegni a UITableView un delegato, puoi usare i suoi metodi per gestire le notifiche che la tua vista tabella ha fatto qualcosa. Probabilmente userete uno di

tableView:didEndEditingRowAtIndexPath:
o
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
per fare ciò.

+0

Purtroppo, tableView: didEndEditingRowAtIndexPath sembra solo per far scattare dopo interrompere l'azione "side-colpo". Anche se fossi in grado di tracciare il punto in cui la modifica è terminata (cioè quando l'utente fa clic su "done"), le immagini sarebbero ancora sbagliate fino a quel momento. L'altro metodo suggerito che sto già utilizzando per consentire il trascinamento della selezione solo alle altre sezioni. Questo è passato prima che io sappia se ho bisogno di aggiornare o meno. – h4xxr