Parametres tableView (cellForRowAt

Bonjour,
je suis en train de re regarder le cours sur UIKit. Lorsque l’on appelle la fonction
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) → UITableViewCell { code}
L’object retourné de type UITableViewCell sert à la fonction mais je ne vois pas comment elle comprend que la valeur return doit être utilisé comme paramètre ?
Est ce que cela vient de la ligne "MaTableView.dataSource = self " ?

Merci d’avance !

Une UITableView ne peut pas fonctionner toute seule dans son coin. Elle a besoin de deux autres objets :

  • Une dataSource (UITableViewDataSource) fournissant des informations sur la structure de la tableView (nombre d’éléments et contenu de chaque cellule).

  • Un délégué (UITableViewDelegate). C’est l’objet qui reçoit des notifications quand l’état de la tableView est modifié (quand l’utilisateur sélectionne une case par exemple).

En général c’est le viewControler qui sert de dataSource et de délégué.

Quand tu tapes MaTableauView.dataSource = self, cela indique à la tableView que sa dataSource est le viewControler.

Ton code ne doit JAMAIS APPELER cette fonction. C’est la tableView qui l’utilise automatiquement quand elle a besoin de savoir ce qui se trouve dans une cellule spécifique. Si par exemple, elle a besoin d’afficher la cellule n°3 de de la table, elle demande à la DataSourceHé toi, j’ai besoin de connaître le contenu de la cellule n°3. Et c’est pour tout de suite…”.

Ta tâche à toi, en tant que développeur, est que s’arranger pour que cette fonction ai accès à toutes les informations nécessaire pour répondre aux demandes de la tableView.

La doc Apple pour UITableView :
https://developer.apple.com/documentation/uikit/uitableview

La doc Apple pour UITableViewDataSource :
https://developer.apple.com/documentation/uikit/uitableviewdatasource

La doc Apple pour UITableViewDelegate :
https://developer.apple.com/documentation/uikit/uitableviewdelegate

1 « J'aime »

Merci pour cette réponse très détaillée. Mais alors dans quel cas est ce que viewController sert de délégué ? Dans ce cours il est dit qu’on peut simplement utiliser dataSource.
Quand tu dis que je dois JAMAIS l’appeler , ça veut dire quoi ? Parce que sans elle le protocole UITableViewDataSource ne peut pas marcher Xcode affiche une erreur.
Merci

La dataSource ne sert qu’à définir la structure et le contenu de la tableView. C’est purement statique. C’est suffisant dans le cadre d’une première initiation.

L’étape suivante c’est de réagir à un événement survenant sur la tableView. Comment détecter que l’utilisateur vient de sélectionner une case de la tableView ? C’est le travail du délégué de la tableView.

Si tu as juste besoin d’afficher des choses dans une tableView, la dataSource suffit. Mais pour avoir un comportement réactif, il faut définir un délégué.

Je n’ai pas vu les vidéos iOS 11 de Maxime, n’ayant acheté que son premier cours (iOS 10 et Xcode 8). Mais je présume qu’il aborde la question des UITableViewDelegate dans la leçon suivante.

1 « J'aime »

Ce que je veux dire par là, c’est que cette fonction est destinée à un “usage interne”. Elle doit être présente dans le code pour que la tableView sache quoi afficher sur l’écran, mais ton code NE DOIT JAMAIS L’APPELER. Son utilisation est réservée à la tableView.

C’est une fonction destinée à répondre à une question de l’application “hé mec, qu’est-ce je dois afficher à cet endroit ?” Et non a provoquer une action.

C’est un peu la même chose qu’une IBAction tracée à partir du Storyboard. Place un bouton sur le Storyboard, et trace une IBAction appelée actionBouton. Cela vas générer dans le code une fonction actionBouton() que seul l’objet graphique bouton peux utiliser.


Pour résumer, tu dois créer cette fonction et taper du code dedans pour définir le contenu de la tableView. Mais tu ne doit pas l’APPELER dans ton code, jamais … Elle n’existe que pour fournir une information à la tableView quand celle-ci en éprouve le besoin.

1 « J'aime »

Merci vos messages m’ont permis de bien comprendre le fonctionnement de cette fonction. En revanche j’ai toujours un peu de problèmes avec la documentation officielle. Mais cela finira par rentrer.

Supposons que je veuille créer un événement comme celui ci : lorsque l’utilisateur appui sur section un pop-up s’ouvre et lui demande quel nom de section il préfère rentrer. Il faut utiliser delegate dans ce cas ?
Merci