55 votes

Comment fonctionne cellForRowAtIndexPath?

J'AI LU dans la documentation d'apple et ce n'est pas compréhensible pour un débutant en Objective-C comme moi. Je suis en train de mettre en œuvre multicolumn UITableView suivant ce lien exemple et ça ne fonctionne pas donc j'ai besoin de comprendre comment cellForRowAtIndexPath de travail, de causer pour moi personnellement, cette méthode semble assez compliqué.

1) en Quoi est-il de retour? UITableViewCell? Mais pourquoi est-il si étrange?

-(UITableViewCell *)tableView:(UITableView *)tableView 
  • Qu'est-ce que cela? Pourriez-vous expliquer?

2) Comment fait-il appelé et ce qui est plus important, comment suis-je le connecter à un certain UITableView??? Que faire si j'ai deux UITableViews'nommé firstTableView et secondTableView et je veux qu'ils soient différents (pour effectuer cellForRowAtIndexPath différemment)? Comment suis-je censé relier mon UITableViews à ce

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

cette méthode accepte NSIndexPath, pas UITableView. Que vais-je faire?

96voto

jbat100 Points 11445

Je vais essayer et de le décomposer (exemple de la documentation)

/* 
 *   the cellForRowAtIndexPath takes for argument the tableView (so if the same object
 *   is delegate for several tableViews it can identify which one is asking for a cell),
 *   and an idexPath which determines which row and section the cell is returned for. 
 */ 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    /*
     *   This is an important bit, it asks the table view if it has any available cells
     *   already created which it is not using (if they are offscreen), so that it can
     *   reuse them (saving the time of alloc/init/load from xib a new cell ).
     *   The identifier is there to differentiate between different types of cells
     *   (you can display different types of cells in the same table view)
     */

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

    /*
     *   If the cell is nil it means no cell was available for reuse and that we should
     *   create a new one.
     */
    if (cell == nil) {

        /* 
         *   Actually create a new cell (with an identifier so that it can be dequeued). 
         */

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }

    /*
     *   Now that we have a cell we can configure it to display the data corresponding to
     *   this row/section
     */

    NSDictionary *item = (NSDictionary *)[self.content objectAtIndex:indexPath.row];
    cell.textLabel.text = [item objectForKey:@"mainTitleKey"];
    cell.detailTextLabel.text = [item objectForKey:@"secondaryTitleKey"];
    NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"];
    UIImage *theImage = [UIImage imageWithContentsOfFile:path];
    cell.imageView.image = theImage;

    /* Now that the cell is configured we return it to the table view so that it can display it */

    return cell;

}

C'est une source de données méthode de sorte qu'il sera appelée sur un objet quelconque a déclaré lui-même comme la source de données de la UITableView. Il est appelé lors de l'affichage de la table a réellement besoin pour afficher la cellule à l'écran, sur la base du nombre de lignes et sections (que vous spécifiez dans d'autres source de données, méthodes).

38voto

MadhavanRP Points 1964

1) La fonction renvoie une cellule pour une vue de table oui? Donc, l'objet retourné est de type UITableViewCell. Ce sont les objets que vous voyez dans les lignes du tableau. Cette fonction renvoie fondamentalement à une cellule, pour une vue de la table. Mais vous pourriez vous demander, comment la fonction serait de savoir que la cellule de retour pour ce ligne, qui est une réponse à la 2ème question

2)NSIndexPath est essentiellement deux choses:

  • Votre Article
  • Votre ligne

Parce que votre table peut être divisée en de nombreuses sections et chacune avec ses propres lignes, ce NSIndexPath va vous aider à identifier précisément la section et qui ligne. Ils sont tous les deux des entiers. Si vous re un débutant, je dirais d'essayer avec une seule section.

Il est appelé si vous avez de mettre en œuvre l' UITableViewDataSource protocole dans votre vue-contrôleur. Une façon plus simple serait d'ajouter un UITableViewController classe. Je recommande fortement ce parce que Apple a un peu de code écrit pour vous de facilement mettre en œuvre les fonctions que l'on peut décrire un tableau. De toute façon, si vous choisissez de mettre en œuvre ce protocole vous-même, vous devez créer un UITableViewCell objet et de le retourner pour quelle que soit la ligne. Jetez un oeil à sa classe de référence pour comprendre la re-usablity parce que les cellules qui sont affichés dans la vue de table sont réutilisés encore et encore(c'est une conception très efficace d'ailleurs). Comme lorsque vous avez deux vues de table, regardez la méthode. La vue de la table est passé, de sorte que vous ne devriez pas avoir un problème par rapport à cela.

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