Emplacement approprié pour mettre à jour le contenu UITableViewCell

J'ai toujours mis à jour le contenu tableView:cellForRowAtIndexPath: dans tableView:cellForRowAtIndexPath: comme ceci:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell:UITableViewCell = self.resultsTableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) as UITableViewCell! // update cell content cell.backgroundColor = UIColor.clearColor() cell.textLabel?.text = myTextSsortingng return cell } 

La documentation montre également le contenu mis à jour dans tableView:cellForRowAtIndexPath: Cependant, aujourd'hui je lis

Le contenu de la cellule doit être défini avant d'être affiché. Peu importe quel object cellulaire est utilisé. Tout ce qui nous intéresse, c'est qu'il a les bonnes choses à afficher quand il est transmis au moteur de rendu. Ainsi, le bon endroit pour définir le contenu de la cellule est tableView:willDisplayCell:forRowAtIndexPath:

La raison en est mentionnée dans le même article . Il parle de la

… problème où la cellule personnalisée semble changer randomment le contenu lorsque la table est défilée. La raison pour laquelle cela se produit est que le contenu de la cellule est défini dans la tableView:cellForRowAtIndexPath: qui n'est pas au bon endroit. Dans cette méthode, le système s'attend seulement à get l'object de cellule. Une fois qu'une cellule est affichée, le système ne requestra pas l'object cellulaire tant qu'il ne l'a pas perdue (c'est-à-dire lorsque l'object cellulaire a été détruit) et ne peut pas find de rlocation à réutiliser. Si, toutefois, un rlocation est trouvé, il est réutilisé, et vous finirez par voir le contenu de cette cellule réutilisée à la place de la cellule d'origine.

Est-ce exact? Je n'ai jamais remarqué de problème auparavant, mais devrais-je mettre à jour le contenu de ma cellule dans tableView:willDisplayCell:forRowAtIndexPath: Ai-je été trompé par la documentation?

La déclaration est fausse.

cellule personnalisée apparaît pour 'modifier randomment le contenu' lorsque la table est défilée

se produit seulement si

  • dequeueReusableCellWithIdentifier est (mis) en dehors de cellForRowAtIndexPath .
  • Le contenu entier de la cellule n'est pas défini de manière fiable dans un état défini à l'intérieur de cellForRowAtIndexPath .
  • Le contenu de la cellule est manipulé en dehors de cellForRowAtIndexPath .

Le développeur est fortement déconseillé d'utiliser l'un des trois cas.

Il est donc parfaitement possible de fournir la cellule et de mettre à jour le contenu de cellForRowAtIndexPath .

PS: Je suppose que willDisplayCell:forRowAtIndexPath: est une méthode héritée provenant de NSTableView basée sur des cellules dans macOS où les methods de délégué de source de données ne prennent pas en charge pour modifier l'apparence de la cellule.