web-dev-qa-db-fra.com

Comment fonctionne cellForRowAtIndexPath?

J'ai lu Apple et ce n'est pas compréhensible pour un tel débutant en Objective-C comme moi. J'essaie d'implémenter multicolonne UITableView en suivant cet exemple lien et cela ne fonctionne tout simplement pas. J'ai donc besoin de comprendre comment fonctionne cellForRowAtIndexPath, ce qui me cause personnellement la méthode semble assez compliquée.

1) Qu'est-ce qu'il retourne? UITableViewCell? Mais pourquoi ça a l'air si étrange?

-(UITableViewCell *)tableView:(UITableView *)tableView 
  • Qu'est-ce que c'est? Pourriez-vous s'il vous plaît expliquer?

2) Comment s'appelle-t-il et qu'est-ce qui est le plus important, comment le connecter à un certain UITableView ??? Que se passe-t-il si j'ai deux UITableView nommées firstTableView et secondTableView et que je veux qu'elles soient différentes (pour exécuter cellForRowAtIndexPath différemment)? Comment suis-je censé lier mon UITableViews à ce

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

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

53
Andrey Chernukha

1) La fonction retourne une cellule pour une vue de table oui? Ainsi, l'objet renvoyé est de type UITableViewCell. Ce sont les objets que vous voyez dans les lignes de la table. Cette fonction renvoie essentiellement une cellule, pour une vue sous forme de tableau. Mais vous pourriez vous demander comment la fonction saurait quelle cellule renvoyer pour quelle ligne, à laquelle répond la deuxième question

2) NSIndexPath est essentiellement deux choses-

  • Votre section
  • Votre rang

Parce que votre table peut être divisée en plusieurs sections et chacune avec ses propres lignes, ceci NSIndexPath vous aidera à identifier avec précision quelle section et quelle ligne. Ce sont deux entiers. Si vous êtes débutant, je dirais que vous essayez avec une seule section.

Il est appelé si vous implémentez le protocole UITableViewDataSource dans votre contrôleur de vue. Un moyen plus simple serait d’ajouter une classe UITableViewController. Je le recommande vivement car Apple contient du code permettant d'implémenter facilement les fonctions permettant de décrire une table. Quoi qu'il en soit, si vous choisissez d'implémenter ce protocole vous-même, vous devez créer un UITableViewCell objet et retournez-le pour n'importe quelle ligne. Jetez un coup d'œil à sa référence de classe pour comprendre le caractère réutilisable, car les cellules affichées dans la vue tableau sont réutilisées encore et encore (cette conception est très efficace).

En ce qui concerne deux vues de table, examinez la méthode. La vue table y est transmise, vous ne devriez donc pas avoir de problème à cet égard.

37
MadhavanRP

Je vais essayer de le décomposer (exemple de documention )

/* 
 *   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 indexPath 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;

}

Ceci est une méthode DataSource et sera donc appelée quel que soit l'objet qui s'est déclaré lui-même comme étant le DataSource du UITableView. Il est appelé lorsque la vue tabulaire doit afficher la cellule à l'écran, en fonction du nombre de lignes et de sections (que vous spécifiez dans d'autres méthodes DataSource).

96
jbat100

Fondamentalement, il s'agit de concevoir votre cellule. Le nom de cellule est indiqué pour chaque cellule et le numéro de cellule est trouvé par indexpath.row et le numéro de section par indexpath.section. Ici, vous pouvez utiliser une étiquette, un bouton ou une image textée avec tout ce que vous voulez, mis à jour pour toutes les lignes du tableau. Réponse pour la deuxième question Dans la cellule pour la ligne au chemin d'index, utilisez une instruction if

en objectif C

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

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

  if(tableView == firstTableView)
  {
      //code for first table view 
      [cell.contentView addSubview: someView];
  }

  if(tableview == secondTableView)
  {
      //code for secondTableView 
      [cell.contentView addSubview: someView];
  }
  return cell;
}

In Swift 3.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{
  let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

  if(tableView == firstTableView)   {
     //code for first table view 
  }

  if(tableview == secondTableView)      {
     //code for secondTableView 
  }

  return cell
}
6
Koushik