Ich weiß, dass diese Frage für iOS 5 war, aber zum Nutzen zukünftiger Leser beachten Sie, dass wir jetzt effektives iOS 6 dequeueReusableHeaderFooterViewWithIdentifier
anstelle von verwenden können dequeueReusableCellWithIdentifier
.
Also viewDidLoad
, rufen Sie entweder registerNib:forHeaderFooterViewReuseIdentifier:
oder registerClass:forHeaderFooterViewReuseIdentifier:
. Dann viewForHeaderInSection
rufen Sie an tableView:dequeueReusableHeaderFooterViewWithIdentifier:
. Sie verwenden mit dieser API keinen Zellenprototyp (es handelt sich entweder um eine NIB-basierte Ansicht oder eine programmgesteuert erstellte Ansicht), dies ist jedoch die neue API für Kopf- und Fußzeilen in der Warteschlange.
Verwenden Sie einfach eine Prototypzelle als Kopf- und / oder Fußzeile Ihres Abschnitts.
tableView:viewForHeaderInSection:
Methode oder dietableView:viewForFooterInSection:
Methode[tableView dequeueReusableCellWithIdentifier:]
, um den Header zu erhaltentableView:heightForHeaderInSection:
Methode.Bearbeiten: So ändern Sie den Header-Titel (kommentierte Frage):
tableView:viewForHeaderInSection:
Methode erhalten Sie das Label, indem Sie Folgendes aufrufen:quelle
viewForHeaderInSection
Methode zurück (es müssen keine benutzerdefinierten UIViews hinzugefügt werden).dequeueReusableHeaderFooterViewWithIdentifier
wird eingeführt und wird nun dieser Antwort vorgezogen. Aber wenn Sie das richtig verwenden, sind jetzt weitere Schritte erforderlich. Ich habe guide @ samwize.com/2015/11/06/… .UITableViewCell
als Header-Ansicht verwenden. Es wird sehr schwierig sein, visuelle Störungen zu beheben - der Header verschwindet manchmal, weil Zellen aus der Warteschlange entfernt werden, und Sie werden stundenlang nach dem Grund suchen, warum dies so ist, bis Sie feststellen,UITableViewCell
dass er nicht zumUITableView
Header gehört.In iOS 6.0 und höher haben sich die Dinge mit der neuen
dequeueReusableHeaderFooterViewWithIdentifier
API geändert .Ich habe einen Leitfaden geschrieben (getestet auf iOS 9), der als solcher zusammengefasst werden kann:
UITableViewHeaderFooterView
viewDidLoad
viewForHeaderInSection
und verwenden SiedequeueReusableHeaderFooterViewWithIdentifier
, um die Kopf- / Fußzeile zurückzugewinnenquelle
Ich habe es in iOS7 mit einer Prototypzelle im Storyboard zum Laufen gebracht. In meiner benutzerdefinierten Abschnittsüberschriftenansicht befindet sich eine Schaltfläche, die einen im Storyboard eingerichteten Übergang auslöst.
Beginnen Sie mit der Lösung von Tieme
Wie pedro.m hervorhebt, besteht das Problem darin, dass durch Tippen auf die Abschnittsüberschrift die erste Zelle im Abschnitt ausgewählt wird.
Wie Paul Von betont, wird dies behoben, indem die Inhaltsansicht der Zelle anstelle der gesamten Zelle zurückgegeben wird.
Wie Hons jedoch betont, stürzt die App durch langes Drücken auf den Abschnittskopf ab.
Die Lösung besteht darin, alle gestureRecognizers aus contentView zu entfernen.
Wenn Sie in Ihren Abschnittsüberschriften keine Gesten verwenden, scheint dieser kleine Hack es zu schaffen.
quelle
Wenn Sie Storyboards verwenden, können Sie eine Prototypzelle in der Tabellenansicht verwenden, um Ihre Kopfzeilenansicht zu gestalten. Legen Sie eine eindeutige ID und viewForHeaderInSection fest. Sie können die Zelle mit dieser ID aus der Warteschlange entfernen und in eine UIView umwandeln.
quelle
Wenn Sie eine schnelle Implementierung benötigen, befolgen Sie die Anweisungen auf der akzeptierten Antwort und implementieren Sie dann in Ihrem UITableViewController die folgenden Methoden:
quelle
Die Lösung, die ich mir ausgedacht habe, ist im Grunde dieselbe, die vor der Einführung von Storyboards verwendet wurde.
Erstellen Sie eine neue, leere Schnittstellenklassendatei. Ziehen Sie eine UIView auf die Leinwand, Layout wie gewünscht.
Laden Sie die Schreibfeder manuell und weisen Sie sie in den Delegate-Methoden viewForHeaderInSection oder viewForFooterInSection dem entsprechenden Kopf- / Fußzeilenabschnitt zu.
Ich hatte die Hoffnung, dass Apple dieses Szenario mit Storyboards vereinfachte und nach einer besseren oder einfacheren Lösung suchte. Zum Beispiel können benutzerdefinierte Tabellenkopf- und -fußzeilen einfach hinzugefügt werden.
quelle
tableView:titleForHeaderInSection
, ist ein Einzeiler.Wenn Sie die Inhaltsansicht der Zelle zurückgeben, treten zwei Probleme auf:
viewForHeaderInSection
, wenn Sie auf Abruf eine neue Zelle erstellen)Lösung:
Wrapper-Klasse für Tabellenkopf \ Fußzeile. Es ist nur ein geerbter Container
UITableViewHeaderFooterView
, der die Zelle enthälthttps://github.com/Magnat12/MGTableViewHeaderWrapperView.git
Registrieren Sie die Klasse in Ihrer UITableView (z. B. in viewDidLoad).
In Ihrem UITableViewDelegate:
quelle
Ich habe Folgendes getan, um träge Kopf- / Fußzeilenansichten zu erstellen:
[NSNull null]
quelle
Ich war in einem Szenario in Schwierigkeiten, in dem der Header nie wiederverwendet wurde, selbst wenn alle richtigen Schritte ausgeführt wurden.
Als Tipp für alle, die die Situation erreichen möchten, leere Abschnitte (0 Zeilen) anzuzeigen, sollten Sie Folgendes warnen:
dequeueReusableHeaderFooterViewWithIdentifier verwendet den Header erst wieder, wenn Sie mindestens eine Zeile zurückgeben
Ich hoffe es hilft
quelle
Um Damons Vorschlag zu folgen , habe ich den Header wie eine normale Zeile mit einem Offenlegungsindikator auswählbar gemacht.
Ich habe der Prototypzelle des Headers eine von UIButton untergeordnete Schaltfläche (Unterklassenname "ButtonWithArgument") hinzugefügt und den Titeltext gelöscht (der fett gedruckte "Titel" -Text ist ein weiteres UILabel in der Prototypzelle).
Setzen Sie dann die Schaltfläche auf die gesamte Kopfansicht und fügen Sie mit Avarios Trick einen Offenlegungsindikator hinzu
ButtonWithArgument.h
ButtonWithArgument.m
quelle
Sie sollten die Lösung von Tieme als Basis verwenden, aber die
viewWithTag:
und andere fischartige Ansätze vergessen. Versuchen Sie stattdessen, Ihren Header neu zu laden (indem Sie diesen Abschnitt neu laden).Nachdem Sie Ihre benutzerdefinierte Zellen-Header-Ansicht mit all den ausgefallenen
AutoLayout
Dingen eingerichtet haben, müssen Sie sie einfach aus der Warteschlange entfernen und die Inhaltsansicht nach der Einrichtung zurückgeben, z.quelle
Was ist mit einer Lösung, bei der der Header auf einem Ansichtsarray basiert:
Weiter im Delegierten:
quelle
Zelle hinzufügen
StoryBoard
und einstellenreuseidentified
Code
und
Verwenden:
quelle
Ähnlich wie bei Laszlo Answer, aber Sie können dieselbe Prototypzelle sowohl für die Tabellenzellen als auch für die Abschnittskopfzelle wiederverwenden. Fügen Sie Ihrer UIViewController-Unterklasse die ersten beiden Funktionen hinzu
quelle
Hier ist die Antwort von @Vitaliy Gozhenko in Swift.
Zusammenfassend erstellen Sie eine UITableViewHeaderFooterView, die eine UITableViewCell enthält. Diese UITableViewCell ist "dequeuable" und Sie können sie in Ihrem Storyboard entwerfen.
Erstellen Sie eine UITableViewHeaderFooterView-Klasse
Fügen Sie Ihre Tabellenansicht mit dieser Klasse in Ihre viewDidLoad-Funktion ein:
Wenn Sie nach einem Abschnittsheader fragen, entfernen Sie eine CustomHeaderFooterView und fügen Sie eine Zelle ein
quelle