web-dev-qa-db-fra.com

UITableViewCell setSelected: animé: ne fonctionne pas

Ça me rend fou. J'ai regardé ici sur S.O. pour ce que je pensais être une réponse simple, mais ne pouvait pas en trouver une.

Dans ma coutume UITableViewCell:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{   
    // Configure the view for the selected state
    if (selected) {        
        [self.languageLevelNameLabel setTextColor:[UIColor blackColor]];        
    }
    else {        
        [self.languageLevelNameLabel setTextColor:[UIColor colorMessageCountZero]];
    }

    [self setNeedsDisplay];
}

Dans tableView:cellForRowAtIndexPath: du contrôleur:

 if ([level integerValue] == indexPath.row) {

        [cell setSelected:YES];
    }

J'ai inséré des points de rupture et selected == YES est passé pour la cellule correcte et l'instruction if est en cours d'exécution alors qu'elle devrait l'être, mais le texte n'est jamais défini sur blackColor.

19
Ramsel

Si vous voulez définir votre cellule comme sélectionnée, utilisez la méthode selectRowAtIndexPath:animated:scrollPosition: comme celle-ci dans votre méthode cellForRowAtIndexPath de votre vue tableau

Objectif c

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

Swift 4

tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
44
Fran Martin

Pour que la cellule apparaisse sélectionnée, vous devez appeler -setSelected:animated: depuis -tableView:willDisplayCell:forRowAtIndexPath: comme suit:

Objectif c:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (/* should be selected */) {
        [cell setSelected:YES animated:NO];
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];  // required, as noted below
    }
}

Swift 3:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if (/* should be selected */) {
        cell.setSelected(true, animated: false)
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)  // required, as noted below
    }
}

Appeler -setSelected de n’importe où ailleurs n’a aucun effet.

Pourquoi? Après l'initialisation ou la suppression de la file d'attente d'une cellule, mais avant de l'afficher, la vue tableau appelle une méthode privée appelée -_configureCellForDisplay:forIndexPath: qui, entre autres choses, définit la propriété selected de la cellule sur NO. Le willDisplayCell:forRowAtIndexPath: du délégué est appelé après cela, vous permettant de définir tout ce qui est nécessaire pour l'affichage.

58
Drew C

Il n'est pas nécessaire d'appeler la méthode setSelected de la cellule. Apple souhaite définir l'état sélectionné de la cellule par le biais de deux fonctions, l'une est didSelectRowAtIndexPath, l'autre didDeselectRowAtIndexPath, elles se produisent toujours par paires.

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

[self tableView:self.leftTableView didSelectRowAtIndexPath:indexPath];
[self.leftTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
0
Cherish

Essayer

NSIndexPath* selectedCellIndexPath= [NSIndexPath indexPathForRow:number_row  inSection:0];
[self tableView:tableViewList didSelectRowAtIndexPath:selectedCellIndexPath];
[tableViewList selectRowAtIndexPath:selectedCellIndexPath animated:YES scrollPosition:UITableViewScrollPositionTop];
0
Ar No