140 votes

Sélectionner une ligne de tableview de manière programmatique

Comment puis-je sélectionner par programme un UITableView de sorte que

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

est exécuté ? selectRowAtIndexPath ne mettra en évidence que la ligne.

0 votes

J'ai rencontré le même problème et je n'ai fait que suivre le lien : stackoverflow.com/questions/5324501/ J'espère que cela vous sera utile.

118voto

dulgan Points 1707

Comme Jaanus l'a dit :

L'appel de cette méthode (-selectRowAtIndexPath:animated:scrollPosition :) n'entraîne pas la réception par le délégué d'un tableView:willSelectRowAtIndexPath : ou tableView:didSelectRowAtIndexPath :, ni n'envoie de message notifications UITableViewSelectionDidChangeNotification aux observateurs.

Il suffit donc d'appeler la delegate méthode vous-même.

Par exemple :

Version Swift 3 :

let indexPath = IndexPath(row: 0, section: 0);
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
self.tableView(self.tableView, didSelectRowAt: indexPath)

Version d'ObjectiveC :

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath 
                            animated:YES 
                      scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

Version Swift 2.3 :

 let indexPath = NSIndexPath(forRow: 0, inSection: 0);
 self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
 self.tableView(self.tableView, didSelectRowAtIndexPath: indexPath)

112voto

Jaanus Points 8609

Desde la documentation de référence :

L'appel de cette méthode ne fait pas en sorte que le délégué reçoive un tableView:willSelectRowAtIndexPath: o tableView:didSelectRowAtIndexPath: et il n'envoie pas non plus de message UITableViewSelectionDidChangeNotification les notifications aux observateurs.

Ce que je ferais, c'est :

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self doSomethingWithRowAtIndexPath:indexPath];
}

Ensuite, là où vous vouliez appeler selectRowAtIndexPath, vous appelez plutôt doSomethingWithRowAtIndexPath. En plus de cela, vous pouvez également appeler selectRowAtIndexPath si vous voulez que le retour d'information de l'interface utilisateur se produise.

4 votes

Ou lorsque vous sélectionnez la ligne de façon programmatique, vous pouvez appeler tableView:didSelectRowAtIndexPath : vous-même (dans la classe que vous avez câblée comme délégué).

3 votes

Cette méthode me semble être un piratage, elle a permis de faire le travail mais je pense qu'il devrait y avoir une meilleure façon de le faire.

1 votes

Je ne pense pas vraiment que vous ayez besoin de créer un appel "doSomethingWithRowAtIndexPath" ; ne pouvez-vous pas simplement appeler la méthode déléguée et passer les arguments dont vous avez besoin pour exécuter la logique didSelect depuis l'endroit où vous avez implémenté la méthode déléguée ?

63voto

anq Points 1420

L'interface de l'UITableView selectRowAtIndexPath:animated:scrollPosition : devrait faire l'affaire.

Passe juste UITableViewScrollPositionNone pour scrollPosition et l'utilisateur ne verra aucun mouvement.


Vous devriez également être en mesure d'exécuter manuellement l'action :

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

après vous selectRowAtIndexPath:animated:scrollPosition: pour que la mise en évidence se produise, ainsi que toute logique associée.

0 votes

Désolé, c'est ce que j'utilise. J'ai accidentellement mis scrollToRowAtIndexPath. J'ai mis à jour la question. scrollToRowAtIndexPath ne met en évidence que la cellule.

2 votes

Oui, je suis désolé. Il est dit que ça ne déclenchera pas didSelectRowAtIndexPath juste là dans le lien de la documentation que j'ai posté. Je dois apprendre à lire.

0 votes

@anq : Merci beaucoup ! Cela m'aide lorsque j'appelle le didSelectRowAtIndexPath:indexPath dans la cellule personnalisée.

21voto

Nazir Points 571

Si vous voulez sélectionner une ligne, ceci vous aidera.

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath 
                           animated:NO 
                     scrollPosition:UITableViewScrollPositionNone];

Cela va également mettre en évidence la ligne. Ensuite, déléguez

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];

4voto

Alexander Volkov Points 241

Il existe deux méthodes différentes pour les plateformes iPad et iPhone, vous devez donc mettre en œuvre les deux :

  • le gestionnaire de sélection et
  • transition.

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    
    // Selection handler (for horizontal iPad)
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    
    // Segue (for iPhone and vertical iPad)
    [self performSegueWithIdentifier:"showDetail" sender:self];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X