J'ai configuré la tableview avec des liaisons correctes de délégué et de source de données .. la méthode reloadData appelle la source de données et les méthodes de délégué à l'exception de viewForHeaderInSection:
.
Pourquoi est-ce si?
ios
uitableview
uitableviewsectionheader
inforeqd
la source
la source
heightForHeaderInSection:
mis en œuvre?sectionHeaderHeight
?Réponses:
L'utilisation de
tableView:viewForHeaderInSection:
nécessite que vous implémentiez égalementtableView:heightForHeaderInSection:
. Cela devrait renvoyer une hauteur non nulle appropriée pour l'en-tête. Assurez-vous également de ne pas implémenter également letableView:titleForHeaderInSection:
. Vous ne devez utiliser que l'un ou l'autre (viewForHeader
outitleForHeader
).la source
numberOfSections
.titleForHeaderInSection:
etviewForHeaderInSection:
et que la vue renvoyée par ce dernier est une sous-classe deUITableViewHeaderFooterView
alors elletextLabel.text
est automatiquement définie sur la version en majuscules de latitleForHeaderInSection:
chaîne. Pour éviter ce problème, n'implémentez pastitleForHeaderInSection:
ou n'utilisez pas d' étiquette personnalisée au lieu de celle héritéetextLabel
.L'astuce est que ces deux méthodes appartiennent à des
UITableView
protocoles différents :tableView:titleForHeaderInSection:
est uneUITableViewDataSource
méthode de protocole, oùtableView:viewForHeaderInSection
appartientUITableViewDelegate
.Cela signifie:
Si vous implémentez les méthodes mais que vous vous assignez uniquement comme
dataSource
pourUITableView
, votretableView:viewForHeaderInSection
implémentation sera ignorée.tableView:viewForHeaderInSection
a une priorité plus élevée. Si vous implémentez les deux méthodes et que vous vous attribuez à la fois ledataSource
et ledelegate
pour leUITableView
, vous retournerez les vues pour les en-têtes de section mais votretableView:titleForHeaderInSection:
sera ignoré.J'ai également essayé de supprimer
tableView:heightForHeaderInSection:
; cela fonctionnait bien et ne semblait pas affecter les procédures ci-dessus. Mais la documentation indique qu'il est nécessaire pour que letableView:viewForHeaderInSection
fonctionne correctement; donc pour être sûr, il est sage de mettre en œuvre ceci aussi.la source
UITableViewDelegate
àself
, parce que je pensais, c'esttableView:viewForHeaderInSection
uneUITableViewDataSource
méthode. Je vous remercie!titleForHeader
qui a une taille intrinsèque. La taille intrinsèque est calculée en fonction de la famille de polices et de la taille.@rmaddy a mal énoncé la règle, deux fois: en réalité,
tableView:viewForHeaderInSection:
ne nécessite pas que vous implémentiez égalementtableView:heightForHeaderInSection:
, et il est également parfaitement bien d'appeler à la foistitleForHeader
etviewForHeader
. Je vais énoncer la règle correctement juste pour mémoire:La règle est simplement que
viewForHeader
cela 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:
.Mettez la table
sectionHeaderHeight
.Appel
titleForHeader
(cela donne en quelque sorte à l'en-tête une hauteur par défaut s'il n'en a pas autrement).Si vous ne faites rien de tout cela, vous n'aurez aucun en-tête et
viewForHeader
ne serez pas appelé. C'est parce que sans hauteur, le runtime ne saura pas redimensionner la vue, donc il ne prend pas la peine d'en demander une.la source
tableView:viewForHeaderInSection:
: "Cette méthode ne fonctionne correctement que lorsqu'elletableView:heightForHeaderInSection:
est également implémentée.".titleForHeaderInSection
etviewForHeaderInSection
? La vue tableau n'appellera que l'un des deux (j'oublie ce qui a la priorité pour le moment).viewForHeader
appelée sans aucune de ces trois façons d'attribuer une hauteur. J'ai eu cela se produire, où mon aviewForHeader
été appelé et les en-têtes sont apparus très bien, jusqu'au jour où, sans changement de ma part, ils ne l'ont pas fait . C'est à ce moment-là que j'ai commencé à expérimenter pour découvrir commentviewForHeader
s'appeler les exigences minimales . Et maintenant je sais. Et maintenant vous aussi.Le don
estimatedSectionHeaderHeight
et lessectionHeaderHeight
valeurs ont résolu mon problème. par exemple,self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
la source
En partant de la réponse de rmaddy, j'essayais de masquer la vue d'en-tête et retournais 0,0f pour "tableView: heightForHeaderInSection" et une vue de 0 hauteur à partir de
tableView:viewForHeaderInSection
.Après avoir changé de
return 1.0f
àreturn 0.0f
intableView:heightForHeaderInSection
, la méthode déléguéetableView:viewForHeaderInSection
a en effet été appelée.Il s'avère que mon effet souhaité fonctionne sans avoir à utiliser "tableView: heightForHeaderInSection"; mais cela peut être utile à d'autres personnes qui rencontrent un problème lors de l'appel de la méthode de délégation "tableView: heightForHeaderInSection".
la source
Vous devez mettre en œuvre
tableView:heightForHeaderInSection:
et définir la hauteur de l'en-tête> 0.Cette méthode déléguée va de pair avec le
viewForHeaderInSection:
méthode.J'espère que ça aide.
la source
Il convient de noter brièvement que si votre implémentation de
tableView:heightForHeaderInSection:
retoursUITableViewAutomaticDimension
,tableView:viewForHeaderInSection:
ne sera pas appelée.UITableViewAutomaticDimension
suppose qu'une normeUITableViewHeaderFooterView
sera utilisée qui est remplie avec la méthode déléguéetableView:titleForHeaderInSection:
.À partir des commentaires dans le
UITableView.h
:la source
estimatedSectionHeaderHeight
une valeur,tableView:viewForHeaderInSection
sera appelée (de la même manière que les dimensions automatiques pour les lignes fonctionnent)Je viens d'avoir un problème avec les en-têtes qui ne s'affichent pas pour iOS 7.1 , mais qui fonctionnent bien avec les versions ultérieures que j'ai testées, explicitement avec 8.1 et 8.4.
Pour le même code, 7.1 était pas appel d' une des méthodes de délégués d' en- tête de section à tous, y compris:
tableView:heightForHeaderInSection:
ettableView:viewForHeaderInSection:
.Après expérimentation, j'ai constaté que la suppression de cette ligne de mes
viewDidLoad
en-têtes créés réapparaît pour la version 7.1 et n'a pas d'impact sur les autres versions que j'ai testées:… Donc, il semble y avoir une sorte de conflit là-bas pour 7.1, au moins.
la source
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érimentations, j'ai eu une solution , nous devons remplacer cette méthode car,
Bien que j'ai coché les deux options
du storyboard comme le dit Apple, mais j'ai quand même cette erreur étrange.
Remarque : cette erreur n'a été affichée que sur la version IOS-10 et non sur la version IOS-11 . C'est peut-être un bogue de xCode. Merci
la source
Voici ce que j'ai trouvé ( Swift 4 ) (grâce à ce commentaire sur une autre question)
Que j'utilise titleForHeaderInSection ou viewForHeaderInSection - ce n'est pas qu'ils n'étaient pas appelés lorsque la vue de la table était défilée et que de nouvelles cellules étaient chargées, mais tous les choix de police que j'ai faits pour le textLabel de headerView n'apparaissaient que sur ce qui était initialement visible au chargement , et non comme le tableau défilait.
Le correctif était willDisplayHeaderView:
la source
Dans mon cas, j'ai créé une vue d'en-tête en utilisant
UITableviewCell
et en renvoyant la celluleviewForHeaderInSection
comme cecichangé cela en
A travaillé pour moi.
la source
Dans mon cas
a été implémenté dans une classe dérivée très lointaine qui ne gênait pas de passer en superclasse.
la source
La raison pour laquelle il
viewForHeaderInSection
n'est pas appelé est l'une des deux raisons suivantes:Soit vous n'avez pas configuré votre
UITableViewDelegate
, soit vous ne l'avez pas configuréUITableViewDelegate
correctement.la source
Dans mon cas, c'était parce que je n'ai pas implémenté:
la source
Parfois, le réglage
tableview.delegate
oudatasource = nil
dans les méthodesviewWillAppear:
ouviewDidAppear:
peut provoquer ce problème. Assurez-vous de ne pas faire cela ...la source
J'avais copié et collé les deux méthodes suivantes d'un projet Swift 2 dans mon projet Swift 3 qui n'ont jamais été appelées car dans Swift 3 ces méthodes doivent avoir "-" avant le premier nom de paramètre.
la source