2013-04-19 15 views
5

Ho una UISearchBar. Quando seleziono la cella, vorrei che l'intera cella avesse un [UIColor grayColor];iOS: Colore sfondo: UITableView e Accessorio hanno lo stesso colore di sfondo

Con il codice sottostante, il colore contentView appare in grigio; tuttavia, il colore di sfondo accessoryType presenta come blu:

enter image description here

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  

UITableViewCell *cell = [self.searchDisplayController.searchResultsTableView cellForRowAtIndexPath:indexPath]; 
    cell.contentView.backgroundColor = [UIColor grayColor]; 

    if (self.lastSelected && (self.lastSelected.row == indexPath.row)) 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     [cell setSelected:NO animated:TRUE]; 
     self.lastSelected = nil; 
    } else { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     cell.accessoryView.backgroundColor = [UIColor grayColor]; // Not working 
     [cell setSelected:TRUE animated:TRUE]; 

     UITableViewCell *old = [self.searchDisplayController.searchResultsTableView cellForRowAtIndexPath:self.lastSelected]; 
     old.accessoryType = UITableViewCellAccessoryNone; 
     [old setSelected:NO animated:TRUE]; 
     self.lastSelected = indexPath; 
    } 

Come faccio a fare il Blue appaiono anche come [UIColor grayColor]?

risposta

10

Si sta modificando il colore di sfondo della vista del contenuto che è solo una porzione della vista cella.

UITableViewCell representation

Cambiare il colore di tutta la cella di sfondo. Tuttavia non è possibile farlo nel tuo tableView:didDeselectRowAtIndexPath: perché non funzionerà come spiegato here.

Nota: Se si desidera cambiare il colore di una cella di fondo (impostando il colore di una cella tramite la proprietà backgroundColor dichiarato dal UIView sfondo) si deve fare nel metodo del delegato tableView:willDisplayCell:forRowAtIndexPath: e non in tableView:cellForRowAtIndexPath: dell'origine dati.

Nel suo caso, tenere traccia della riga selezionata nella tableView:didSelectRowAtIndexPath: salvando l'indice in un Ivar e ricaricare la vista tabella.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    _savedIndex = indexPath; 
    [tableView reloadData]; 
} 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([_savedIndex isEqual:indexPath]) { 
     cell.backgroundColor = [UIColor grayColor]; 
    } 
} 
+0

Grazie per la spiegazione dettagliata. Anche se ho trovato una risposta più semplice: [cell setSelectionStyle: UITableViewCellSelectionStyleGray]; quello ha funzionato per il mio caso, sto presupponendo che la maggior parte della gente probabilmente accosentirebbe con la vostra risposta. Se puoi anche includere un codice per tenere traccia della cella selezionata, desidero contrassegnare la tua risposta come corretta. – user1107173

+0

Esatto, stavo dando per scontato che volevi che la cella fosse dipinta con un colore personalizzato ma come hai indicato per il colore grigio '[cella setSelectionStyle: UITableViewCellSelectionStyleGray];' funziona altrettanto :-) – andreagiavatto

+0

Sebbene la domanda fosse per selezionare una cella, Ho avuto quel problema con la vista accessoria molte volte! Per aggirarlo ho sottoclasse e disegnato un chevron simile. Questa spiegazione, oltre allo straordinario diagramma, mi ha aiutato ad aumentare il tempo. +1 di sicuro. Grazie @andreagiavatto! – Thawe