2013-02-15 5 views
5

Aggiungo elementi (ad esempio riconoscitori di gesti, sottoview) alle celle in cellForRowIndexPath. Non voglio aggiungerli se la cella viene riutilizzata (presumibilmente), quindi c'è un modo per dire facilmente se la cella è nuova o viene riutilizzata?Come determinare se una cella restituita da dequeueReusableCellWithIdentifier viene riutilizzata in iOS 6?

Il prototipo di cella è definito in uno storyboard.

Non sto utilizzando una sottoclasse personalizzata per la cella (sembra eccessivo). Sto usando il tag cella per identificare le visualizzazioni secondarie, quindi non posso usarlo.

Potrei usare l'approccio pre-iOS 6, ma sicuramente c'è un modo migliore per fare qualcosa di così semplice?

Non riesco a trovare nulla online, così ho paura di essere confuso da qualcosa - ma è una cosa difficile da cercare.

+1

Non sei confuso, fa confondere il modello un po '. – jrturton

+0

@jrturton. Grazie. Stavo iniziando a dubitare di me stesso. – dommer

+2

Se non vuoi aggiungere cose se la cella viene riutilizzata, ciò implica (penso) che non stai cambiando ciò che stai aggiungendo in modo dinamico, quindi perché non aggiungere queste cose in IB per iniziare ? – rdelmar

risposta

7

Il modo più semplice per affrontare questo è quello di verificare l'esistenza delle cose è necessario aggiungere.

Quindi supponiamo che la tua cella abbia bisogno di avere una sottoview con il tag 42 se non è già presente.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    UIView *subview = [cell viewWithTag:42]; 
    if (!subview) { 
     ... Set up the new cell 
    } 
    else { 
     ... Reuse the cell 
    } 
    return cell; 
} 
1

Probabilmente è eccessivo rispetto all'utilizzo dell'approccio pre-iOS6 (nessuna classe registrata), ma se si vuole davvero attenervisi, è possibile utilizzare associated objects.

#import <objc/objc-runtime.h> 

static char cellCustomized; 

... 
-(UITableViewCell *)getCell 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellForIdentifier:myCell]; 
    if(!objc_getAssociatedProperty(cell, &cellCustomized)) { 
     [self setupCell:cell]; 
     objc_setAssociatedProperty(cell, &cellCustomized, @YES, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    } 
    return cell; 
} 

... 

(non testato)

Problemi correlati