2013-07-27 12 views
7

Attualmente sto scrivendo un'app, utilizzando gli storyboard, che contiene due s UITableView nella stessa finestra.UITableView reloadData non sembra causare cellForRowAtIndexPath: essere chiamato

Quando si esegue l'applicazione, il primo UITableView verrà compilato con un numero di "Numeri di registrazione".

Quando l'utente tocca una cella, il secondo UITableView deve riempire con dettagli sulla cella selezionata.

Quando si tocca un numero nella prima tabella Ho un metodo che guida il:

[mySecondTableView reloadData] 

Il che lo fa. Ho l'impressione che quando si richiama il comando reloadData, dovrebbe quindi chiamare entrambi:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

e

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

I primi fuochi, ma la seconda no. Ho sia l'origine dati che il delegato cablati a self.

Non sono sicuro di ciò che mi manca.

Entrambi i metodi hanno lo scopo di sparare?

+4

Non è nemmeno certo che iOS 7 sia rilevante anche qui; questi metodi erano presenti in Cocoa Touch bene prima di quella versione di sistema. –

+1

Cosa restituisce numberOFRowsInSection? È 0? – rdelmar

+0

rdelmar - No, ci sono 16 oggetti da mostrare e restituisce quel numero. – Fritzables

risposta

19

Dopo reloadData, provate questo:

NSIndexSet * sections = [NSIndexSet indexSetWithIndex:0]; 
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationNone]; 

ho trovato se il cambiamento dei dati è sottile, la visualizzazione della tabella sembra per ottimizzare via la necessità di aggiornare.

+0

Per qualche ragione, questo in realtà lo ha risolto per me. È sbagliato! – OlivaresF

+0

@OlivaresF - Grazie, ha funzionato per me, si sposta all'interno di cellForRowAtIndexPath. ma non aggiornare in TableView. –

+0

indexI metodi di synithindex non sono più disponibili in swift, e sto affrontando questo stesso problema di reloaddata – srinivas

34

Quando mi succede qualcosa di simile, di solito è perché sto chiamando -reloadData al di fuori del thread principale.

+0

Questo è qualcosa che viene trascurato facilmente, specialmente quando si lavora con gestori di completamento richiamati da thread in background. Suggerimento eccellente. –

+2

Mi ha sbattuto la testa per ore. Finalmente ha funzionato dopo aver letto questo. Grazie. Fai attenzione ai blocchi di completamento come dice Bart. Assicurati di chiamare [tableView performSelectorOnMainThread: @selector (reloadData) withObject: nil waitUntilDone: NO] –

1

Ho appena sostenuto lo stesso problema. Ho utilizzato uno performSelectorOnMainThread per chiamare un metodo che chiama quindi lo reloadData. Questo era necessario poiché stavo cercando di aggiornare al di fuori del thread principale come suggerito dal hatfinch.

1

Assicurati di chiamare performSelectorOnMainThread con waitUntilDone: NO, altrimenti si può ancora avere lo stesso problema

2

risposte a punta non risolve il problema vista tabella. E 'stato ancora chiamando

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

tuttavia metodo di disegno cellulare non è stato licenziato:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

mio problema era che (a causa del mio errore, ovviamente) vista tabella altezza era solo 0. Quindi come tabella visualizza celle che sono visibili, non tenta mai di visualizzare una cella. Quando ho cambiato il valore dell'altezza, il metodo della cella di disegno ha iniziato a sparare di nuovo.

Linea Botom ricontrolla il telaio del tuo tavolo e assicurati di avere valori di larghezza e altezza diversi da zero!

1

Trovato un'altra causa di non chiamata cellForRowAtIndexPath.

Se numberOfRowsInSection restituisce 0, cellForRowAtIndexPath non verrà chiamato. Questo è accaduto nel mio caso a causa di un NSArray disallocato durante una modifica del controller di visualizzazione e il suo conteggio conseguente (poiché era zero) restituendo 0.

0

Dopo aver sbattuto la testa contro un muro per giorni questo ha risolto il mio problema:

Impostare il punto di interruzione Tutte le eccezioni e verificare se si sta ottenendo un'eccezione fuori limite nell'origine dati. Senza impostare il punto di interruzione non si verifica un arresto anomalo e la visualizzazione tabella non verrà semplicemente ricaricata.

risposta completa here

0

ero il debug di un problema simile per ore prima ho realizzato il mio .reloadData() chiamata veniva eseguita da un callback di una precedente istanza del controller della vista.

Quindi il mio punto di interruzione è stato colpito sulla .reloadData() chiamata del mio vecchio istanza di tale controller della vista, ma la nuova istanza che è stato effettivamente dimostrato di non stava ricaricando perché non era quello di eseguire il callback che ha chiamato .reloadData().

Problemi correlati