2010-01-28 11 views
50

Dalla documentazione ufficiale:iPhone - Che cosa sono riutilizzatori (UITableViewCell)?

L'identificatore reimpiegate è associato a un oggetto UITableViewCell che delegato del tavolo-vista crea con l'intento di riutilizzarlo come base (per motivi di prestazioni) per più righe di una visualizzazione della tabella . Viene assegnato all'oggetto cella in initWithFrame: reuseIdentifier: e non può essere modificato in seguito. Un oggetto UITableView mantiene una coda (o un elenco) delle celle attualmente riutilizzabili, ciascuna con il proprio identificativo di riutilizzo e le rende disponibili al delegato nel metodo dequeueReusableCellWithIdentifier :.

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

non capisco questo. Bene, capisco l'idea di base, penso, che crei UITableViewCells e provi a riutilizzarne il maggior numero possibile invece di crearne di nuovi (o qualcosa del genere). Ma cosa decide esattamente se una cella è riutilizzabile o meno? Se ho due celle identiche (visivamente), ma con testi diversi (beh, suppongo che non siano del tutto identici), possono entrambi avere lo stesso identificatore? O dovrebbero avere quelli diversi? O in quale situazione si suppone di utilizzare identificatori diversi?

Qualcuno può chiarire o collegare a un luogo in cui si trova?

risposta

65

Ok, questo è il modo credo che funziona:

Utilizzando dequeueReusableCellWithIdentifier per il tableView, si può notevolmente accelerare le cose. Invece di istanziare molte celle, basta istanziare quante ne sono necessarie, cioè quante sono visibili (questo viene gestito automaticamente). Se si scorre su un'area nella lista in cui ci sono "celle" che non hanno ancora la loro rappresentazione visiva, invece di istanziarne di nuove, si riutilizza quelle già esistenti.

Potete provare voi stessi in questo modo:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    NSLog(@"new one"); 
} 
else 
{ 
    NSLog(@"old one"); 
} 

Ricordate, si desidera solo dequeueReusableCellWithIdentifier per restituire una cella se è applicabile. Quindi, se una cella verrà riutilizzata, assicurati che sia corretta per la situazione. Ecco a cosa servono gli identificatori di riutilizzo. Di solito, ne avrai bisogno solo uno. Ma potrebbe esserci un elenco che utilizza diversi tipi di celle e, in tal caso, dovresti tenerli separati fornendo diversi riutilizzatori di riutilizzo. Altrimenti si potrebbe finire per ottenere una cella trattata come un altro tipo di cella (ad esempio, cella UITableView anziché quella personalizzata desiderata).

Quindi, fondamentalmente, a quanto ho capito, utilizzare diversi identificatori di riutilizzo per diversi tipi di celle, in cui il tipo indica classe. Se si utilizzano solo celle standard, probabilmente è necessario un solo riutilizzatore.

Questo modello di progettazione è noto come object pooling.

+14

ho sviluppato iPhone per lungo tempo e inciampo su questa risposta ha chiarito molto questo argomento. –

+0

Bella spiegazione :) – Karun

+0

Oggetto pooling termine corretto uno upvote per quello – Shajo

10

solo aggiungere alcune cose da quano è altrimenti molto buona risposta: (ho cercato di aggiungere questo come un commento, ma era troppo lungo!)

Anche riutilizzare gli identificatori possono essere omessi in via di sviluppo, anche se questo deve essere fatto in circostanze molto specifiche. Se si dispone di una vista tabella di 6-7 celle e ognuna è diversa, è possibile che si crei una nuova cella con zero poiché l'identificatore potrebbe essere preferibile.

Avere una cella riutilizzabile significa che in ogni volta che il cellForRowAtIndexPath si chiama, è necessario selezionare la cella, inizializzarlo se non ci sono cellule riutilizzabile, e al di fuori del campo di applicazione init è necessario in modo esplicito scorrere tutte le possibili indexpaths e impostare il valori per ogni etichetta in modo esplicito a seconda del tipo di cella che hai! Quindi, in una vista tabella con 10 celle dinstinct, dovrai occuparti di creare la cella, se nulla, e di riempirla a seconda di ciò che hai creato.

Pertanto, in questo caso, è preferibile in termini di manutenzione del codice inizializzare ogni cella con identificatore nil (poiché non verrà comunque riutilizzato) e riempire le informazioni di ogni cella in modo appropriato senza preoccuparsi di riutilizzarlo.

Problemi correlati