2012-01-23 19 views
7

Ahoy!Creazione di un UIView riutilizzabile simile a UITableViewCell

Sto cercando di creare un UIView riutilizzabile (per vari motivi) simile all'implementazione di UITableViewCell utilizzata in UITableViewController. Mi piacerebbe usare la vista riutilizzabile in un UIScrollView, quindi so che non sto cercando di ottenere qualcosa che sia completamente irraggiungibile.

L'implementazione predefinita di questo è:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //declare cell identifier 
    static NSString *cellIdentifier = @"cell_identifier"; 

    //dequeue cell 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    //check cell is valid 
    if(cell == nil) 
    { 
     //create a new cell 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
    } 

    // 

    //return cell 
    return cell; 
} 

Da questo, vale la pena notare che la cellula viene rimossa dalla coda dal UITableView. Se la cella non è valida, viene creata una nuova cella. La mia domanda è: in che modo questa cella diventa "in coda" per essere riutilizzata in seguito?

Il mio attuale tentato applicazione si presenta così:

- (TestScrollViewCell *)scrollView:(TestScrollView *)_scrollView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //declare cell identifier 
    static NSString *cellIdentifier = @"cell_identifier"; 

    //dequeue cell 
    TestScrollViewCell *cell = (TestScrollViewCell *)[scrollView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    //check cell is valid 
    if(cell == nil) 
    { 
     //create a new cell 
     cell = [[TestScrollViewCell alloc] initWithFrame:CGRectZero]; 
    } 

    // 

    //return cell 
    return cell; 
} 

Sto pensando che l'aggiunta di un NSMutableDictionary al mio TestScrollView per memorizzare il cellIdentifier e il TestScrollViewCell (UIView) e poi strappando di nuovo fuori sulla base del dizionario la chiave sarebbe un buon inizio ma è davvero una vera implementazione di cellule "riutilizzabili"?

Il problema che posso vedere è che aggiungerei l'UIView a ScrollView che è posizionato in base al frame. La dequamazione di una vista in questo senso non mi consentirà di aggiungere la vista alla vista di scorrimento senza influenzare la prima vista (modificando la cornice) ma sicuramente questo è il modo in cui funzionano UITableViewCells, nonché le intestazioni/i piè di pagina delle sezioni?

Ho guardato allo this implementation che sembra seguire lo stesso percorso che intendevo implementare ma non sono al 100% venduto che questa è una vera implementazione di celle riutilizzabili.

Qualcuno ha avuto fortuna con questo in precedenza? Sto cercando di prendere il comando di Apple su questo, ma oltre a UITableViewCell e MKAnnotationView (MapKit) non ci sono implementazioni accessibili di questo da cui attingere.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

3

Non è solo la vista, è l'intero UITableViewController che dovrai ricreare. Il flusso di riutilizzo è il seguente: dequeueReusableCell ottiene una cella riutilizzata vuota da una certa memoria, suppongo, da NSMutableArray (preleva il primo oggetto dall'array, quindi lo elimina dall'array e lo restituisce). Se array è vuoto, il metodo restituisce zero. Controlla il valore della cella, se è zero, crei una nuova istanza della classe della cella. Se non è nulla, lo riempi con i tuoi dati. Questo vale per ogni cella visibile, cioè per ogni cella che può essere contenuta sullo schermo. Qualsiasi cella non visibile non è inizializzata. Quando l'utente scorre la tabella, cella che è andata completamente fuori dallo schermo (non visibile un solo pixel) inviata a riusare Queue - tutte le loro subviews e valori ritornano ai valori predefiniti o appena cancellati, e quindi la cella viene aggiunta alla fine del nostro NSMutableArray che è la coda. Spero di aver spiegato abbastanza bene. EDIT: Oh, e un'altra cosa: avrete bisogno di code di riutilizzo diverse per ogni identificatore di riutilizzo.

Problemi correlati