2013-07-15 15 views
26

Ich möchte einen benutzerdefinierten Header Schnittansicht in einem separaten .xib IBUITableViewHeaderFooterView in Interface

Verwendung in IB i keine Komponente UITableViewHeaderFooterView (ähnlich UITableViewCell) und weisen eine Wiederverwendung für sie

finden jedoch erstellen So, wie in benutzerdefinierten Header-Abschnitt erstellen?

erstelle ich eine Klasse, die von MySection UITableViewHeaderFooterView erbt eine .xib erstellen, MySection.xib Register xib für Zellen-Wiederverwendungs ​​

das Problem ist, wie die initWitReuseIdentifier verwenden ....

Antwort

58

Es ist absolut möglich und Apple bietet ein Beispiel here.

Laden Sie den Beispielcode herunter und schauen Sie sich SectionHeaderView.xib an.

Der Weg ist es, eine XIB mit einem einzigen UIView darauf zu erstellen. Setzen Sie den Klassentyp dann auf eine Klasse, die von UITableViewHeaderFooterView erbt.

Sobald Sie eine Spitze mit einer Klasse, die von UITableViewHeaderFooterView erbt, die folgende nennen die Klasse für die Wiederverwendung als Kopf- oder Fußzeile zu registrieren:

static NSString * const SectionHeaderViewIdentifier = @"SectionHeaderViewIdentifier"; 

[self.tableView registerNib:[UINib nibWithNibName:@"SectionHeaderView" bundle:nil] forHeaderFooterViewReuseIdentifier:SectionHeaderViewIdentifier]; 

den Blick in Gebrauch zu nehmen, implementieren die Tabelle delegieren tableview Methode: viewForHeaderInSection: etwa so:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSinteger)section { 

    SectionHeaderViewClass *sectionHeaderView = (SectionHeaderView *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:SectionHeaderViewIdentifier]; 

    // Do stuff... 

    return sectionHeaderView; 
} 
+18

Auf iOS8 gibt es eine Warnung wie folgt: Die Hintergrundfarbe auf UITableViewHeaderFooterView wurde eingestellt. Bitte verwenden Sie stattdessen contentView.backgroundColor. Um in IB zu beheben, legen Sie die Hintergrundfarbe der UIView auf "Standard" fest. –

+2

In iOS 8.3 müssen Sie auch die Eigenschaft sectionHeaderHeight von UITableView auf etwas setzen, ansonsten wird standardmäßig 0 verwendet und Ihre Delegate-Methode wird nicht aufgerufen. (Ja, das ist dumm.) – patr1ck

+0

Klärung des OP (weil es eine Weile gedauert hat): Ihr XIB sollte * eine * root-level Unteransicht haben (analog zu einer 'UITableViewCell' Inhaltsansicht) und alle Ihre anderen Ansichten sollten Subviews davon sein. Zusätzlich zu dem obigen Kommentar von @ patr1ck scheint es, dass Sie in iOS 10.x sowohl 'tableView.SectionHeaderHeight' * als auch * tableView.StepHeaderHeight' einstellen müssen (selbst wenn Sie die Werte für einzelne Sektionen in Ihrem' UITableViewDelegate' überschreiben). –

1

Seine Genug, um eine Ansicht zu erstellen und ihre Klasse in IB zuzuordnen (die Wiederverwendungs-ID muss nicht im Interface Builder (wie bei einer benutzerdefinierten UITableViewCell) festgelegt werden))

0

Die UITableViewHeaderFooterView-Dokumentation enthält registerNib:forHeaderFooterViewReuseIdentifier: Methode

Aber zur Zeit (ab 4. September 2013) Objektbibliothek in Interface Builder keine UITableViewHeaderFooterView enthalten. Das macht registerNib: forHeaderFooterViewReuseIdentifier: nutzlos, weil es keine Möglichkeit gibt, die Ansicht korrekt in der Nib zu konfigurieren. Vielleicht ist es besser, wieder zu verwenden Zelle ...

+0

Matt Becker ist richtig, getestet und funktioniert gut. –

13

I ein guide geschrieben (getestet auf iOS 9), die von 4 Schritten umfasst:

  1. Subclass UITableViewHeaderFooterView
  2. Nib erstellen mit der Unterklasse Ansicht und fügen 1 Container Ansicht, die
  3. In viewDidLoad alle anderen Ansichten in der Kopfzeile/Fußzeile enthält, rufen registerNib:forHeaderFooterViewReuseIdentifier: für die Tabellenansicht
  4. viewForHeaderInSection implementieren und verwenden dequeueReusableHeaderFooterViewWithIdentifier die Kopfzeile/Fußzeile
+0

Nice one sam! (: –

1

folgenden Lösungen ermöglichen es mir, zu Drag-assign IB Artikel zurück zu bekommen als Variablen zu kodieren. UITableViewHeaderFooterView lässt das nicht von Anfang an zu.

  1. erstellen (Neue Datei/CocoaTouchClass) UITableViewHeaderFooterView .h.m.xib normalerweise

  2. vorübergehend Super von UITableViewHeaderFooterView zu UIView umbenennen. Ziehen Sie Ihre UI-Elemente nach Bedarf auf den Code. IB weist den Schlüsselwert korrekt zu und kehrt dann zu UITableViewHeaderFooterView zurück, wenn Sie fertig sind.

  3. In Ihrer Tabellenansicht registerNib: anstelle von registrieren registerClass:. Bereite den Rest der Tabellenansicht normal vor (zB: entschachteln).
0
  1. in xib neue Ansicht erstellen

  2. Ansicht laden aus Spitze und setzen als footerview anzuzeigen zu einer Tabellen-

UIView * headerview = [[[NSBundle main] loadNibNamed: @ "ReguistrationHeaderView" Besitzer: self Optionen: nil] firstObject]; [self.tableview setTableFooterView: headerview];

0

Ich habe immer UITableViewCell als Kopfzeilen (oder Fußzeilen) für meine Tabellen verwendet, um sie direkt im Storyboard bearbeiten zu können.

Mein Workflow:

  • ich eine MyHeaderTableViewCell Klasse Subklassifizieren UITableViewCell erstellen und das Hinzufügen alle Steckdosen Ich brauche
  • ich eine UITableViewCell zu meinem Tisch in meinem Storyboard hinzufügen
  • Ich gebe es eine Wiederverwendung Kennung (es: "HeaderCell")
  • I dequeue die Zelle und verwenden seinen Inhalt als mein Kopf

Der entscheidende Teil ist die Rückgabe der contentView der headerCell (nicht die headerCell selbst), sonst werden Sie seltsame Verhaltensweisen beim Spielen mit reloadRowsAt oder ähnlichen Funktionen (Kopfzeilen verschwinden höchstens).

Dies ist mein Code:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

    let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") as! MyHeaderTableViewCell 

    headerCell.lblTitle.text = "My Title" 

    return headerCell.contentView } 

ich nie konfrontiert Probleme dabei (oder zumindest meine Kunden bezahlt mich immer).

+0

Sie schreiben, dass Sie nie irgendwelche Probleme begegnet, aber es sieht aus wie ein riskantes Vorgehen und Missbrauch von API –

+0

@PeterLapisu Vielen Dank für Ihre Antwort. Ich stimme mit Ihnen dies kann riskant sein und ziemlich Missbrauch von API aber so lange es funktioniert ohne großen Nachteil finde ich, dass es ein guter Kompromiss zwischen sauberem Code und einfachem Gebrauch ist, also ist es nur eine Lösung, hart ich stimme dir zu, nicht die sauberste. –

Verwandte Themen