Ich habe die Tabellenansicht mit korrekten Delegaten- und Datenquellenverknüpfungen eingerichtet. Die reloadData-Methode ruft die Datenquellen- und die Delegatenmethode mit Ausnahme von auf viewForHeaderInSection:
.
Warum ist das so?
ios
uitableview
uitableviewsectionheader
inforeqd
quelle
quelle
heightForHeaderInSection:
implementiert?sectionHeaderHeight
?Antworten:
Die Verwendung von
tableView:viewForHeaderInSection:
erfordert, dass Sie auch implementierentableView:heightForHeaderInSection:
. Dies sollte eine geeignete Höhe ungleich Null für den Header zurückgeben. Stellen Sie außerdem sicher, dass Sie das nicht auch implementierentableView:titleForHeaderInSection:
. Sie sollten nur das eine oder andere (viewForHeader
odertitleForHeader
) verwenden.quelle
numberOfSections
.titleForHeaderInSection:
undviewForHeaderInSection:
und die Aussicht von dieser zurückgegeben wird , ist eine Unterklasse vonUITableViewHeaderFooterView
dann seinetextLabel.text
automatisch auf die alle Caps Version dertitleForHeaderInSection:
Zeichenfolge. Um dieses Verhalten zu verhindern, implementierentitleForHeaderInSection:
oder verwenden Sie keine benutzerdefinierte Bezeichnung anstelle der geerbtentextLabel
.Der Trick ist, dass diese beiden Methoden zu unterschiedlichen
UITableView
Protokollen gehören:tableView:titleForHeaderInSection:
ist eineUITableViewDataSource
Protokollmethode, zu dertableView:viewForHeaderInSection
gehörtUITableViewDelegate
.Das bedeutet:
Wenn Sie die Methoden implementieren, sich aber nur als
dataSource
für die zuweisenUITableView
, wird IhretableView:viewForHeaderInSection
Implementierung ignoriert.tableView:viewForHeaderInSection
hat eine höhere Priorität. Wenn Sie beide Methoden implementieren und sich sowohl alsdataSource
als auch alsdelegate
für die zuweisenUITableView
, geben Sie die Ansichten für Abschnittsüberschriften zurück, IhretableView:titleForHeaderInSection:
werden jedoch ignoriert.Ich habe auch versucht, zu entfernen
tableView:heightForHeaderInSection:
; es funktionierte gut und schien die oben beschriebenen Verfahren nicht zu beeinflussen. Die Dokumentation besagt jedoch, dass es erforderlich ist, damit dastableView:viewForHeaderInSection
ordnungsgemäß funktioniert. Um sicher zu gehen, ist es auch ratsam, dies umzusetzen.quelle
UITableViewDelegate
zuself
, weil ich dachte, dastableView:viewForHeaderInSection
ist einUITableViewDataSource
Verfahren. Danke dir!titleForHeader
der eine intrinsische Größe hat. Die intrinsische Größe wird basierend auf der Schriftfamilie und -größe berechnet.@rmaddy hat die Regel zweimal falsch angegeben: In Wirklichkeit ist
tableView:viewForHeaderInSection:
es nicht erforderlich, dass Sie auch implementierentableView:heightForHeaderInSection:
, und es ist auch vollkommen in Ordnung, beidetitleForHeader
und aufzurufenviewForHeader
. Ich werde die Regel nur für die Aufzeichnung korrekt angeben:Die Regel ist einfach, dass
viewForHeader
nicht aufgerufen wird, es sei denn, Sie geben dem Header irgendwie eine Höhe. Sie können dies auf drei Arten tun:Implementieren
tableView:heightForHeaderInSection:
.Stellen Sie die Tische ein
sectionHeaderHeight
.Aufruf
titleForHeader
(dies gibt dem Header irgendwie eine Standardhöhe, wenn er sonst keine hat).Wenn Sie keines dieser Dinge tun, haben Sie keine Überschriften und
viewForHeader
werden nicht aufgerufen. Das liegt daran, dass die Laufzeit ohne Höhe nicht weiß, wie die Größe der Ansicht geändert werden soll, sodass sie nicht nach einer solchen fragen muss.quelle
tableView:viewForHeaderInSection:
: "Diese Methode funktioniert nur dann korrekt, wenn sietableView:heightForHeaderInSection:
auch implementiert ist."titleForHeaderInSection
undviewForHeaderInSection
? In der Tabellenansicht wird nur eine der beiden aufgerufen (ich vergesse, welche im Moment Vorrang hat).viewForHeader
aufgerufen wird . Ich hatte dies geschehen, wo meine aufgerufen wurden und die Überschriften gut auftauchten, bis sie eines Tages ohne Änderung meinerseits dies nicht taten . Zu diesem Zeitpunkt begann ich zu experimentieren, um herauszufinden, welche Mindestanforderungen zu nennen sind . Und jetzt weiß ich es. Und jetzt auch du.viewForHeader
viewForHeader
Geben
estimatedSectionHeaderHeight
undsectionHeaderHeight
Werte haben mein Problem behoben. z.B,self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
quelle
Als ich von der Antwort von rmaddy abging, versuchte ich, die Header-Ansicht auszublenden und gab 0.0f für "tableView: heightForHeaderInSection" und eine 0-height-Ansicht von zurück
tableView:viewForHeaderInSection
.Nach dem Wechsel von
return 1.0f
zureturn 0.0f
intableView:heightForHeaderInSection
wurde die Delegate-MethodetableView:viewForHeaderInSection
tatsächlich aufgerufen.Es stellt sich heraus, dass mein gewünschter Effekt funktioniert, ohne "tableView: heightForHeaderInSection" verwenden zu müssen. Dies kann jedoch für andere nützlich sein, die Probleme beim Aufrufen der Delegatenmethode "tableView: heightForHeaderInSection" haben.
quelle
Sie sollten
tableView:heightForHeaderInSection:
die Höhe für den Header> 0 implementieren und festlegen.Diese Delegatmethode geht mit der
viewForHeaderInSection:
Methode einher .Ich hoffe das hilft.
quelle
Es lohnt sich kurz darauf hingewiesen , dass , wenn Ihre Implementierung von
tableView:heightForHeaderInSection:
RenditenUITableViewAutomaticDimension
, danntableView:viewForHeaderInSection:
wird nicht aufgerufen werden.UITableViewAutomaticDimension
Es wird davon ausgegangen, dass ein Standard verwendetUITableViewHeaderFooterView
wird, der mit der Delegate-Methode gefüllt isttableView:titleForHeaderInSection:
.Aus Kommentaren in der
UITableView.h
:quelle
estimatedSectionHeaderHeight
Wert festlegen ,tableView:viewForHeaderInSection
wird dieser aufgerufen (ähnlich wie die automatischen Abmessungen für Zeilen funktionieren)Ich hatte gerade ein Problem mit Headern, die für iOS 7.1 nicht angezeigt wurden , aber mit späteren Versionen, die ich getestet habe, einwandfrei funktionieren, explizit mit 8.1 und 8.4.
Für genau denselben Code hat 7.1 überhaupt keine der Delegatmethoden für Abschnittsheader aufgerufen, einschließlich:
tableView:heightForHeaderInSection:
undtableView:viewForHeaderInSection:
.Nach dem Experimentieren stellte ich fest, dass das Entfernen dieser Zeile aus meinen
viewDidLoad
erstellten Headern für 7.1 erneut angezeigt wurde und keine Auswirkungen auf andere von mir getestete Versionen hatte:… Also scheint es dort zumindest für 7.1 eine Art Konflikt zu geben.
quelle
Das gleiche Problem trat bei mir auf, aber da ich die automatische Höhenberechnung von xCode 9 verwendet habe , kann ich keinen expliziten Höhenwert wie oben angegeben angeben . Nach einigen Experimenten habe ich eine Lösung gefunden , wir müssen diese Methode überschreiben als:
Obwohl ich beide Optionen überprüft habe
vom Storyboard, wie Apple sagt, aber trotzdem habe ich diesen seltsamen Fehler.
Bitte beachten Sie : Dieser Fehler wurde nur auf der IOS-10- Version angezeigt, nicht auf der IOS-11- Version. Vielleicht ist es ein Fehler von xCode. Vielen Dank
quelle
Folgendes habe ich gefunden ( Swift 4 ) (dank dieses Kommentars zu einer anderen Frage)
Ob ich titleForHeaderInSection oder viewForHeaderInSection verwendet habe - es war nicht so, dass sie nicht aufgerufen wurden, als die Tabellenansicht gescrollt und neue Zellen geladen wurden, aber alle Schriftarten, die ich für das textLabel der headerView getroffen habe, wurden nur auf dem angezeigt, was beim Laden ursprünglich sichtbar war und nicht, als die Tabelle gescrollt wurde.
Das Update war willDisplayHeaderView:
quelle
In meinem Fall habe ich eine Header-Ansicht erstellt, indem ich
UITableviewCell
die ZelleviewForHeaderInSection
wie folgt verwendet und zurückgegeben habeänderte dies zu
Hat für mich gearbeitet.
quelle
In meinem Fall
wurde in einer weit entfernten abgeleiteten Klasse implementiert, die sich nicht die Mühe machte, in die Oberklasse einzutreten.
quelle
Der Grund, warum
viewForHeaderInSection
nicht angerufen wird, ist einer von zwei Gründen:Entweder haben Sie Ihre nicht eingerichtet
UITableViewDelegate
oder Sie haben IhreUITableViewDelegate
falsch eingerichtet.quelle
In meinem Fall war es der Grund, warum ich nicht implementiert habe:
quelle
Manchmal kann das Einstellen von
tableview.delegate
oderdatasource = nil
in den MethodenviewWillAppear:
oderviewDidAppear:
dieses Problem verursachen. Stellen Sie sicher, dass Sie dies nicht tun ...quelle
Ich hatte die folgenden zwei Methoden aus einem Swift 2-Projekt ausgeschnitten und in mein Swift 3-Projekt eingefügt, die nie aufgerufen wurden, da diese Methoden in Swift 3 vor dem ersten Parameternamen "-" haben müssen.
quelle