Sélectionnez la ligne tableview par programme


135

Comment sélectionner une UITableViewligne par programme pour que

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

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


J'ai rencontré le même problème et très bien le lien: stackoverflow.com/questions/5324501/ ... J'espère que cela vous sera utile.
michael

Réponses:


109

De la documentation de référence:

L'appel de cette méthode n'entraîne pas la réception d'un message tableView:willSelectRowAtIndexPath:ou par le délégué tableView:didSelectRowAtIndexPath:et n'envoie pas de UITableViewSelectionDidChangeNotificationnotifications aux observateurs.

Ce que je ferais, c'est:

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

Et puis, à partir de l'endroit où vous vouliez appeler selectRowAtIndexPath, vous appelez à la place doSomethingWithRowAtIndexPath. En plus de cela, vous pouvez également appeler selectRowAtIndexPath si vous souhaitez que les commentaires de l'interface utilisateur se produisent.


4
Ou lorsque vous sélectionnez la ligne par programme, vous pouvez appeler tableView: didSelectRowAtIndexPath: yourself (dans la classe que vous avez câblée en tant que délégué).
Kendall Helmstetter Gelner

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

1
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 transmettre les arguments dont vous avez besoin pour exécuter la logique didSelect à partir de l'endroit où vous avez implémenté la méthode déléguée?
ImpactZero

111

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'une tableView: willSelectRowAtIndexPath: ou tableView: didSelectRowAtIndexPath: message, ni n'envoie de notifications UITableViewSelectionDidChangeNotification aux observateurs.

Il vous suffit donc d'appeler la delegatemé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 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)

63

SelectRowAtIndexPath : animated: scrollPosition: devrait faire l'affaire.

UITableViewScrollPositionNonePassez simplement pour scrollPosition et l'utilisateur ne verra aucun mouvement.


Vous devriez également pouvoir exécuter manuellement l'action:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

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


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

2
Ouais, je suis désolé. Il dit qu'il ne déclenchera pas didSelectRowAtIndexPath juste là dans le lien de documentation que j'ai publié. J'ai besoin d'apprendre à lire.
anq

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

21

si vous voulez sélectionner une ligne cela vous aidera

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

Cela mettra également en évidence la ligne. Puis déléguez

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];

18

Solution Swift 3/4/5

Sélectionnez une ligne

let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)

DeSelect Row

let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)

Pour moi, ajouter ".delegate?" était la clé. (Swift 4.5)
KoreanXcodeWorker

4

Il existe deux méthodes différentes pour les plates-formes iPad et iPhone, vous devez donc implémenter les deux:

  • gestionnaire de sélection et
  • segue.

    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];

3

Utilisez cette catégorie pour sélectionner une ligne de table et exécuter une séquence donnée après un délai.
Appelez ceci dans votre viewDidAppearméthode:

[tableViewController delayedSelection:withSegueIdentifier:]


@implementation UITableViewController (TLUtils)

-(void)delayedSelection:(NSIndexPath *)idxPath withSegueIdentifier:(NSString *)segueID {
    if (!idxPath) idxPath = [NSIndexPath indexPathForRow:0 inSection:0];                                                                                                                                                                 
    [self performSelector:@selector(selectIndexPath:) withObject:@{@"NSIndexPath": idxPath, @"UIStoryboardSegue": segueID } afterDelay:0];                                                                                               
}

-(void)selectIndexPath:(NSDictionary *)args {
    NSIndexPath *idxPath = args[@"NSIndexPath"];                                                                                                                                                                                         
    [self.tableView selectRowAtIndexPath:idxPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];                                                                                                                            

    if ([self.tableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
        [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:idxPath];                                                                                                                                              

    [self performSegueWithIdentifier:args[@"UIStoryboardSegue"] sender:self];                                                                                                                                                            
}

@end

2
La question n'avait rien à voir avec les segues.
supprimé_user

Oui, rien dans votre réponse n'est lié à la question
dulgan

2
J'apprécie cette réponse. Cela fonctionne parfaitement si l'utilisateur souhaite obtenir le même comportement mais utilise des storyboards.
Bijoy Thangaraj
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.