Ç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
.
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)
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.
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];
Essayer
NSIndexPath* selectedCellIndexPath= [NSIndexPath indexPathForRow:number_row inSection:0];
[self tableView:tableViewList didSelectRowAtIndexPath:selectedCellIndexPath];
[tableViewList selectRowAtIndexPath:selectedCellIndexPath animated:YES scrollPosition:UITableViewScrollPositionTop];