2009-05-08 3 views
25

Sto implementando un UITableView ricco con UITableViewCell personalizzato, li mostro sullo schermo in un modo, ma quando escono dallo schermo voglio prendere nota di quello, dal momento che il la seconda volta che si presentano mi piacerebbe che venissero visualizzati in un modo diverso. Pensa automaticamente "contrassegna come letto" quando si esce dallo schermo.Rileva quando UITableViewCell si spegne dallo schermo

Ho cercato un modo per rilevare quando una cella esce dallo schermo (get dealloc'ed o dequeued o equivalente), preferibilmente nella classe: UITableViewController per fare una rapida nota della [indexPath row], ma nel: UITableViewCell è altrettanto buono.

Non sono stato in grado di farlo in alcun modo standard ... il conteggio delle volte che è apparso sembra fuori discussione come faccio più chiamate reloadData sul tavolo.

Qualche idea? Sembra un po 'complicato :)

risposta

-1

Penso che proverei a controllare periodicamente la proprietà indexPathsForVisibleRows di UITableView. Dal più grande percorso dell'indice, è possibile dedurre che tutte le righe precedenti sono state spostate in passato.

+0

Sì, sarebbe un'opzione, potrei inserire quella chiamata nel cellForRowAtIndexPath. Tuttavia, ho righe di altezza variabile, pertanto non è possibile garantire che una cella fuori schermo venga contrassegnata come fuori schermo: | –

5

Penso che si potrebbe utilizzare il metodo

- (NSArray *)visibleCells 

per il vostro UITableView. Ciò restituisce una matrice di tutte le celle che sono visibili. È quindi possibile contrassegnare tutti i dati che "non sono visibili" (cioè non in questo array) nel modo desiderato, in modo tale che quando si scorre su di esso, è stato aggiornato.

Speranza che aiuta

1

Sei sicuro che una cella andando fuori schermo è esattamente ciò che si desidera per la cattura? Se si desidera contrassegnare gli elementi come letti, questo non sembra un modo corretto per farlo. Per esempio, potrei far scorrere il tavolo molto velocemente, e sarei molto sorpreso se annotassi tutto il materiale come letto.

Per quanto riguarda la parte tecnica, è sufficiente tenere un elenco di celle sullo schermo (cellForRowAtIndexPath dovrebbe aggiungere celle a tale elenco) e nel metodo scrollViewDidScroll delegate verificare se alcune di esse non sono più visibili.

Un'altra possibile idea: ricordo che c'è il metodo prepareForReuse nella cella. Non sono sicuro quando viene chiamato, però.

1

Il metodo prepareForReuse su UITableViewCell menzionato da Andrey Tarantsov sembra buono. Mettere un paio di NSLogs li consente di stampare i valori di qualsiasi variabile della cella. Qualche idea su come questo potrebbe essere reimpostato sul controller di visualizzazione tabella?

+0

Io uso un delegato per fare proprio questo –

6

Una volta che UITableViewCell non è visibile, verrà rimosso da UITableView. È possibile sovrascrivere il metodo -(void)removeFromSuperView e fare qualcosa all'interno del metodo. Infine, non dimenticare di chiamare [super removeFromSuperView].

+0

Questa non sembra essere una soluzione affidabile. Ho appena provato questo sul simulatore iOS 6.0, le celle sembrano essere nascoste invece di essere rimosse. Stranamente, 'setHidden: YES' non viene chiamato neanche nella mia implementazione! Apparentemente nell'implementazione di tableView, l'ivar viene impostato direttamente, saltando il metodo del setter di proprietà. –

+0

removeFromSuperView il metodo non viene chiamato dopo la sottoclasse UITableViewCell –

58

Questa è una vecchia questione, ma nel caso in cui qualcuno sta cercando, in iOS6, una nuova funzione UITableViewDelegate è stata introdotta che fa proprio questo:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

Si fa un gran lavoro a che ti dice ogni volta che una cellula è rimosso, tuttavia, è molto completo e quindi se hai fatto una cella di ricarica, anche la vecchia cella che viene sostituita attiverà questa funzione delegato. Nella mia implementazione devo semplicemente verificare se il indexPath passato è ancora all'interno dell'array tableView.indexPathsForVisibleRows.Qualcosa di simile:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([tableView.indexPathsForVisibleRows indexOfObject:indexPath] == NSNotFound) 
    { 
     // This indeed is an indexPath no longer visible 
     // Do something to this non-visible cell... 
    } 
} 
+0

Questa è la soluzione che sto cercando, ma per iOS 5.0. Eventuali suggerimenti? –

+0

Sfortunatamente nulla è stato fornito da Apple. Quello che ho fatto è stato usare scrollViewDidScroll e fare un rapido calcolo per vedere se l'array visibleCells è cambiato dal precedente "frame" della scrollview, nel qual caso faccio qualcosa alla cella ora mancante. Spero possa aiutare! –

+0

Grazie! Proprio quello che stavo cercando! – Undo