132 votes

UITableView : viewForHeaderInSection : non appelé pendant le reloadData :

J'ai configuré le tableau avec des liens corrects entre le délégué et la source de données. La méthode reloadData appelle la source de données et les méthodes du délégué, sauf pour viewForHeaderInSection: .

Pourquoi en est-il ainsi ?

266voto

rmaddy Points 79279

L'utilisation de tableView:viewForHeaderInSection: exige que vous mettiez également en œuvre tableView:heightForHeaderInSection: . Cela devrait renvoyer une hauteur non nulle appropriée pour l'en-tête. Assurez-vous également de ne pas implémenter la méthode tableView:titleForHeaderInSection: . Vous ne devez utiliser que l'un ou l'autre ( viewForHeader ou titleForHeader ).

43voto

Yunus Nedim Mehel Points 2311

L'astuce est que ces deux méthodes appartiennent à différents UITableView protocoles : tableView:titleForHeaderInSection: es un UITableViewDataSource méthode de protocole, où tableView:viewForHeaderInSection appartient à UITableViewDelegate .

Cela signifie :

  • Si vous implémentez les méthodes mais que vous vous attribuez uniquement le rôle de dataSource pour le UITableView , votre tableView:viewForHeaderInSection sera ignorée.

  • tableView:viewForHeaderInSection a une priorité plus élevée. Si vous mettez en œuvre les deux méthodes et que vous vous attribuez à la fois la dataSource et le delegate pour le UITableView vous allez retournez les vues pour les en-têtes de section mais votre tableView:titleForHeaderInSection: seront ignorés.

J'ai également essayé de supprimer tableView:heightForHeaderInSection: il a bien fonctionné et n'a pas semblé affecter les procédures ci-dessus. Mais la documentation indique qu'elle est nécessaire pour le programme tableView:viewForHeaderInSection pour fonctionner correctement ; par conséquent, pour être sûr, il est sage de l'implémenter également.

29voto

matt Points 60113

@rmaddy a mal formulé la règle, deux fois : en réalité, tableView:viewForHeaderInSection: fait no exigent que vous mettiez également en œuvre tableView:heightForHeaderInSection: et il est parfaitement possible d'appeler à la fois titleForHeader y viewForHeader . Je vais énoncer la règle correctement, pour mémoire :

La règle est simplement la suivante viewForHeader ne sera pas appelé à moins que vous ne donniez une hauteur à l'en-tête. Vous pouvez le faire de trois manières différentes :

  • Mettre en œuvre tableView:heightForHeaderInSection: .

  • Définissez les paramètres de la table sectionHeaderHeight .

  • Appelez titleForHeader (cela donne en quelque sorte une hauteur par défaut à l'en-tête s'il n'en a pas).

Si vous ne faites rien de tout cela, vous n'aurez pas d'en-têtes et viewForHeader ne sera pas appelé. C'est parce que sans hauteur, le runtime ne saura pas comment redimensionner la vue, donc il ne prend pas la peine de la demander.

24voto

Sharukh Mastan Points 541

Donner estimatedSectionHeaderHeight y sectionHeaderHeight Ces valeurs ont réglé mon problème. Par exemple, self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension

8voto

rrrrrraul Points 111

En me basant sur la réponse de rmaddy, j'ai essayé de masquer la vue de l'en-tête et j'ai obtenu 0.0f pour "tableView:heightForHeaderInSection" et une vue de hauteur 0 de la part de tableView:viewForHeaderInSection .

Après être passé de return 1.0f a return 0.0f sur tableView:heightForHeaderInSection la méthode du délégué tableView:viewForHeaderInSection a en effet été appelé.

Il s'avère que l'effet désiré fonctionne sans avoir à utiliser "tableView:heightForHeaderInSection" ; mais cela peut être utile à d'autres personnes qui ont un problème pour faire appeler la méthode de délégation "tableView:heightForHeaderInSection".

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