2017-01-24 2 views
0

Le projet maître-détail créé par l'assistant XCode contient l'implémentation de tableView:cellForRowAtIndexPath: qui appelle dequeueReusableCellWithIdentifier:forIndexPath:, puis appelle sa propre méthode personnalisée configureCell pour remplir les contrôles de cellule avec des données valides, puis renvoie la cellule à l'appelant. Si je comprends bien, c'est ainsi que la table sait comment dessiner le contenu de ses cellules. Ce que je ne comprends pas est comment l'utiliser quand je veux obtenir la cellule de mon code. Et est-il même supposé être appelé par mon code, ou est-ce seulement un callback utilisé par le framework de table lui-même? Par exemple, si je veux juste changer le texte d'une étiquette dans la cellule, j'ai pensé que je peux simplement appeler tableView:cellForRowAtIndexPath:, et changer ce dont j'ai besoin dans les contrôles d'objet de cellule résultants. Mais l'appel tableView:cellForRowAtIndexPath: fait réellement un nouvel objet de cellule (réutilisant probablement un du groupe des objets de cellule inutilisés) et remplit TOUS les contrôles comme des vues d'image et des étiquettes dedans avec des données. Cela ne me semble pas bien en ce qui concerne la performance, quand je veux changer une seule étiquette. Puis-je supprimer configureCell sur tableView:cellForRowAtIndexPath:? Mais alors comment s'assurer que tout le contenu de la cellule sera redessiné par le système lorsque [table reloadData] est appelée?Comment tableView: cellForRowAtIndexPath: est censé être utilisé?

P.S. assistant XCode 7 a créé ce genre de code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
    [self configureCell:cell withObject:object]; 
    return cell; 
} 

// Then later in controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 

    case NSFetchedResultsChangeUpdate: 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] withObject:anObject]; 
     break; 

configureCell est appelé deux fois ici. On dirait du non-sens pour moi. J'espérais au moins que les gens qui écrivent du code pour les sorciers comprennent comment cela fonctionne.

+0

Cet appel est uniquement utilisé par le framework de table. vous pouvez appeler reloadRowsAtIndexPaths et envoyer une seule ligne pour mettre à jour une ligne particulière. –

Répondre

1

Deux méthodes différentes sont appelées ici avec des noms similaires.

tableView:cellForRowAtIndexPath: est une méthode UITableViewDataSource que vous implémentez pour créer la cellule que la table doit afficher. La tableview appelle cette méthode lorsqu'une nouvelle cellule va apparaître à l'écran.

controller:didChange:... appelle une méthode différente appelée cellForRowAtIndexPath: qui est une méthode UITableView. Cette méthode interroge la table pour une cellule qui est déjà affichée après avoir été précédemment créée à l'aide de la méthode de source de données tableView:cellForRowAtIndexPath: et n'entraîne pas l'appel à nouveau. Il appelle cette méthode pour accéder à la cellule déjà affichée et la mettre à jour avec de nouvelles informations lorsque l'objet change.

Les deux appels au configureCell sont nécessaires.

+0

Mes mauvais, les noms de méthodes sont trop similaires, je ne les ai pas vu réellement différents. Maintenant, cela a du sens. Merci. – jesse

+0

Mais pourquoi les deux appels à configureCell sont-ils nécessaires ici? Le second ne remplace-t-il pas tout ce qui a été fait par le premier? – jesse

+0

Le second n'est appelé que lorsqu'un objet est modifié. Vous devez donc remplacer les données actuellement dans la cellule par les données de l'objet mis à jour. – dan