2010-02-04 3 views
1

La formulation de la question peut être déroutante. Je comprends pourquoi il est utile pour une méthode comme cellForRowAtIndexPath de recevoir un pointeur le pertinent . UITableViewPourquoi certaines déclarations de méthode dans le protocole UITableViewDataSource sont précédées par "tableView: (UITableView *) tableview?

ce que je ne comprends plus Objective-C sage: Je voudrais mettre un nom sur est la voie d'une déclaration de méthodes

Comme si un objet (par exemple UITableView) qui ont un certain protocole interne (par exemple UITableViewDataSource) enverrait des messages aux implémenteurs en utilisant une manière spéciale de se référencer lui-même

I.E. Au lieu de passer une référence à lui-même comme un argument de message Objective-C régulier, UITableView utilise cette syntaxe spéciale?

+0

Dernier ajout, à partir de l'affiche de la question ... Ok, c'était juste une confusion de type Java sur un aspect d'Objective-C: les messages ne sont pas comparables aux méthodes Java ou aux fonctions C. Le premier paramètre de message ne devrait pas être assimilé à ce à quoi nous sommes habitués: c'est le "nom de la fonction". En d'autres termes, à l'intérieur d'un message Objective-C: "tous les paramètres sont égaux" en terme d'importance. –

Répondre

4

Modifier

Il y a une assez longue discussion dans les commentaires à cette réponse, qui a raffiné la question initiale. Je vais poster les points saillants ici pour aider les autres qui peuvent avoir des questions similaires.

Elle se réduit à une confusion entre les deux méthodes,

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

La première méthode est une méthode d'instance de UITableView qui renvoie un UITableViewCell pour un trajet d'index donné. Cette méthode est appelée sur un objet de vue de table.

La deuxième méthode est une méthode de source de données déclarée dans le protocole UITableViewDataSource qui demande un UITableViewCell pour un chemin d'index donné.

La différence importante est que la première est appelée sur une vue de table instance par une classe qui peut vouloir une référence à une cellule de tableau, et le second est appelé par une vue de table par exemple sur une classe de source de données pour demander une cellule à afficher au chemin d'index donné.

J'espère que cette aide. La plupart des protocoles delegate/datasource dans Cocoa/Cocoa Touch suivent ce modèle. C'est une façon de dire quelque chose comme "cette vue de table veut ces données". Considérons quelque chose comme un objet de champ de texte.

Vous pouvez avoir une interface avec de nombreux objets de champ de texte qui rapportent tous au même délégué pour définir leur comportement pour certaines actions. En se passant comme un argument dans une méthode au délégué, le délégué sait quel champ de texte appelle la méthode.

Je ne suis pas sûr de bien comprendre ce que vous demandez, mais c'est la façon dont les objets informent leurs délégués/datasources de l'objet exact qui envoie la méthode. Dans le cas de UITableView, il est moins évident car il n'y a souvent qu'une seule vue de table par contrôleur de vue de table, mais l'exemple de champ de texte que j'ai donné devrait souligner ce fait.

+0

Merci, mais cela ne répond pas à ma question.Je comprends pourquoi ce mécanisme est utile. Je veux juste y mettre un nom, afin de comprendre pourquoi cela n'est pas fait en utilisant la méthode Objective-C habituelle (c'est-à-dire se faire passer pour une référence, comme un message ordinaire plutôt qu'un mystérieux préfixe de message ...) –

+0

Je ne comprends pas ce que vous demandez. L'instance de vue de table appelle cette méthode sur son délégué/datasource et elle * passe * elle-même comme un argument de message normal. Du point de vue de la table, la méthode ressemble à '[tableSourceSource: self cellForRowAtIndexPath: indexPath];' (probablement simplifiée, mais le point est affiché). – Jasarien

+0

Désolé, mais ce n'est pas ce que j'appelle un argument de message régulier. "Régulier" signifierait: [dataSource cellForRowAtIndexPath:indexPath withTableView:self]. Quoi qu'il en soit, votre exemple aide à mieux comprendre cette syntaxe. –