2010-04-02 6 views
10

lo farei per avere alternative 2 colori di righe, come il primo nero, la seconda bianca, la terza nera, ecc, ecc ...Come posso creare righe con colori alternati per un UITableView su iPhone?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Cell"; 
cell = ((MainCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]); 
if (cell==nil) { 

    NSArray *topLevelObjects=[[NSBundle mainBundle] loadNibNamed:@"MainCell" owner:self options:nil]; 

    for (id currentObject in topLevelObjects){ 
     if ([currentObject isKindOfClass:[UITableViewCell class]]){ 
      if ((indexPath.row % 2)==0) { 
       [cell.contentView setBackgroundColor:[UIColor purpleColor]]; 

      }else{ 
       [cell.contentView setBackgroundColor:[UIColor whiteColor]]; 

      } 
      cell = (MainCell *) currentObject; 
      break; 
     } 
    } 

}else { 

    AsyncImageView* oldImage = (AsyncImageView*) 
    [cell.contentView viewWithTag:999]; 
    [oldImage removeFromSuperview]; 
}return cell; 

Il problema è che quando faccio un rapido scorrimento, il lo sfondo delle celle diventa come l'ultimo nero di 2 celle, il primo di 2 celle è bianco o qualcosa del genere, ma se lo scorrimento lento funziona correttamente. Penso che il problema sia la cache di reusableCell.

Qualche idea?

TIA

+0

Se si imposta CellIdentifier su una stringa letterale, non renderlo statico –

+1

@Jared P: Non c'è niente di sbagliato nel fare un puntatore a una stringa di statica letterale. –

+0

Continuo a pensare in java! .. ma per quello che so con l'identificatore statico il valore dell'oggetto rimane lo stesso una volta assegnato alla prima volta ... – Mat

risposta

25

cellule ottenere riciclati (che è quello che state facendo quando li dequeue e verificare se è pari a zero). Quindi, invece di impostare il colore di sfondo quando crei la cella, impostalo qualche volta dopo. Quindi:

if(!cell) { 
    // create the cell and stuff 
} 
if([indexPath row] % 2) 
    [cell setBackgroundColor:[UIColor whiteColor]]; 
else 
    [cell setBackgroundColor:[UIColor purpleColor]]; 
+0

OK, funziona molto bene ..! – Mat

+0

Questo approccio non ha funzionato per me. Dopo aver provato tutti i tipi di cose, l'unico modo per farlo funzionare era usare un diverso riutilizzatore per le celle di colori diversi. – autremoi

+0

Non è possibile impostare gli sfondi della cella in cellForRowAtIndexPath. Puoi impostarlo nel metodo willDisplayCell. –

2

Quello che credo stia succedendo è che quando si rimuove una cella riutilizzabile, non lo si fa in un ordine definito. Come accadrà, quando si scorre lentamente, le celle diventano disponibili una alla volta e vengono rimosse in coda, in ordine. Quando scorri rapidamente, l'ordine diventa indefinito, così come l'ordine in cui vengono rimossi dalla coda. Credo che questo sia il motivo per cui (in gran parte) Apple ha progettato l'API UITableView per deselezionare tramite identificatore, in modo da poter riutilizzare facilmente diversi tipi di celle, come quelli con colori diversi. Pertanto, consiglio di modificare il codice in modo che ogni colore della cella abbia il proprio identificatore. (Inoltre, se possibile, avere una presa che collega direttamente questa origine dati tableview alla cella, o salvarla in un ivar dopo averla caricata una volta, e quindi copiarla piuttosto che ciclare attraverso oggetti di alto livello)

+0

Non farlo. Se stai solo cambiando il colore di sfondo, è come il contenuto di una cella, quindi usa lo stesso identificatore. Useresti identificatori diversi se avessi arrangiamenti cellulari diversi o qualcosa del genere. Sprechi risorse utilizzando identificatori diversi per qualcosa di simile. –

+0

Come 2 file di pennini con 2 identificatori diversi? – Mat

+0

@Mat: useresti identificatori diversi se avessi layout diversi per le tue celle. Quindi sì, se avessi due pennini che hai caricato in base a contenuti totalmente diversi. In tal caso, non si desidera che accidentalmente venga restituito il tipo di cella errato. Ma non lo usi per modifiche semplici come il colore di sfondo o qualsiasi altra cosa. –

Problemi correlati