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.
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.
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)
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:
otableView:didSelectRowAtIndexPath:
et il n'envoie pas non plus de messageUITableViewSelectionDidChangeNotification
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.
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é).
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.
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 ?
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.
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.
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.
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];
Il existe deux méthodes différentes pour les plateformes iPad et iPhone, vous devez donc mettre en œuvre les deux :
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 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.
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.