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 ?
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 ?
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
).
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.
@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.
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 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.