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.
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. –