J'ai configuré la tableview avec les liens de délégué et de source de données appropriés. La méthode reloadData appelle la source de données et les méthodes de délégation, à l'exception de viewForHeaderInSection:
.
Pourquoi est-ce si?
L'utilisation de tableView:viewForHeaderInSection:
requiert que vous implémentiez également tableView:heightForHeaderInSection:
. Cela devrait renvoyer une hauteur non nulle appropriée pour l'en-tête. Assurez-vous également de ne pas implémenter le 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 protocoles UITableView
: tableView:titleForHeaderInSection:
est une méthodeUITableViewDataSource
protocol, où tableView:viewForHeaderInSection
appartient àUITableViewDelegate
.
Cela signifie:
Si vous implémentez les méthodes mais que vous vous attribuez uniquement comme dataSource
pour la UITableView
, votre implémentation tableView:viewForHeaderInSection
sera ignorée et ne sera jamais appelée.
tableView:viewForHeaderInSection
a une priorité plus élevée. Si vous implémentez les deux méthodes et que vous vous attribuez à la fois dataSource
et delegate
pour UITableView
, vous retournerez les vues pour les en-têtes de section mais votre tableView:titleForHeaderInSection:
sera ignoré.
À des fins de recherche, j'ai supprimé mon tableView:heightForHeaderInSection:
; cela a bien fonctionné et n'a pas semblé affecter les procédures ci-dessus. Mais le document de commentaire indique qu'il est nécessaire pour que le tableView:viewForHeaderInSection
fonctionne correctement; donc pour être sûr, il est sage de mettre cela en œuvre.
@rmaddy a mal énoncé la règle, à deux reprises: en réalité, tableView:viewForHeaderInSection:
fait pas exige que vous implémentiez également tableView:heightForHeaderInSection:
, et il est également tout à fait correct d'appeler titleForHeader
et viewForHeader
. Je vais énoncer la règle correctement pour le compte rendu:
La règle est simplement que viewForHeader
ne sera pas appelé à moins que vous ne donniez une hauteur à l'en-tête. Vous pouvez le faire de trois manières:
Implémentez tableView:heightForHeaderInSection:
.
Définissez la sectionHeaderHeight
de la table.
Appelez titleForHeader
(ceci donne en quelque sorte à l'en-tête une hauteur par défaut s'il n'en a pas autrement).
Si vous ne faites aucune de ces choses, vous n’avez pas d’en-tête et viewForHeader
ne sera pas appelé. En effet, sans hauteur, le moteur d’exécution ne saura pas comment redimensionner la vue, il n’est donc pas inutile d’en demander une.
Donner les valeurs estimatedSectionHeaderHeight
et sectionHeaderHeight
corrigeait mon problème ...__, par exemple, self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
Pour revenir à la réponse de rmaddy, j’essayais de masquer la vue En-tête et renvoyais 0.0f pour "tableView: heightForHeaderInSection" et une vue de hauteur 0 de tableView:viewForHeaderInSection
.
Après le passage de return 1.0f
à return 0.0f
dans tableView:heightForHeaderInSection
, la méthode de délégation tableView:viewForHeaderInSection
a bien été appelée.
Il s'avère que mon effet souhaité fonctionne sans avoir à utiliser "tableView: heightForHeaderInSection"; mais cela peut être utile aux autres utilisateurs rencontrant un problème d'obtention de la méthode déléguée "tableView: heightForHeaderInSection".
Il convient de noter brièvement que si votre implémentation de tableView:heightForHeaderInSection:
renvoie UITableViewAutomaticDimension
, alors tableView:viewForHeaderInSection:
ne sera pas appelé.
UITableViewAutomaticDimension
suppose qu'une norme UITableViewHeaderFooterView
sera utilisée avec la méthode déléguée tableView:titleForHeaderInSection:
.
Des commentaires dans le UITableView.h
:
Le renvoi de cette valeur à partir de
tableView:heightForHeaderInSection:
outableView:heightForFooterInSection:
donne une hauteur qui correspond à la valeur renvoyée à partir detableView:titleForHeaderInSection:
outableView:titleForFooterInSection:
si le titre n'est pas nul.
Vous devez implémenter tableView:heightForHeaderInSection:
et définir la hauteur pour l'en-tête> 0.
Cette méthode déléguée va de pair avec la méthode viewForHeaderInSection:
.
J'espère que ça aide.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
Je viens d'avoir un problème avec les en-têtes qui ne s'affichent pas pour iOS 7.1 , mais qui fonctionnent correctement avec les versions ultérieures que j'ai testées, explicitement avec 8.1 et 8.4.
Pour le même code, 7.1 utilisait not et n’appelait aucune méthode de délégation d’en-tête de section, notamment: tableView:heightForHeaderInSection:
et tableView:viewForHeaderInSection:
.
Après expérimentation, j'ai constaté que en supprimant cette ligne de ma viewDidLoad
, les en-têtes ont réapparu pour la version 7.1 et n'ont pas eu d'impact sur les autres versions que j'ai testées:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
… Donc, il semble y avoir une sorte de conflit ici pour 7.1, au moins.
Le même problème s’est produit avec moi, mais comme j’utilisais le calcul automatique de la hauteur à partir de xCode 9, je ne peux pas donner de valeur de hauteur explicite comme mentionné ci-dessus. Après quelques expériences avec got solution, nous devons remplacer cette méthode par,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
Bien que j'ai vérifié les deux options
de storyboard comme dit Apple, mais j'ai quand même eu cette erreur bizarre.
Remarque:: cette erreur s'est produite uniquement sur la version IOS-10 et non sur la version IOS-11. Peut-être que c'est un bug de xCode. Merci
Voici ce que j'ai trouvé (Swift 4) (Grâce à ce commentaire sur une autre question)
Que j'ai utilisé titleForHeaderInSection ou viewForHeaderInSection - ce n'est pas qu'ils n'ont pas été appelés lorsque la vue tabulaire a été défilée et que de nouvelles cellules ont été chargées, mais tous les choix de police que j'ai faits pour le libellé de headerView n'apparaissaient que sur ce qui était initialement visible au chargement , et pas comme la table a été défilée.
Le correctif était willDisplayHeaderView:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let header = view as? UITableViewHeaderFooterView {
header.textLabel?.font = UIFont(name: yourFont, size: 42)
}
}