Ich habe eine UITableView, die in meiner XIB-Datei ist. Und ich habe eine solche Eigenschaft für den Controller erstellt:
%Vor% Nun möchte ich einen Header für die Tabellenansicht haben (keine Überschrift für jeden Abschnitt). Also, weil ich Custom-Styling haben möchte, habe ich eine neue XIB-Datei mit einer Ansicht erstellt (und ich habe eine Verbindung zu meinem Controller hergestellt, auf dem die myTableView
implementiert ist).
Dann kann ich in viewDidLoad
in meinen Controller schreiben:
Dabei ist myTableViewHeader
eine UIView-Eigenschaft im Controller.
Leider wird die UITView diese UIView nicht anzeigen. Meine Frage ist also, wie kann ich eine UIView in eine UITableView in die Kopfzeile einfügen?
Vielen Dank im Voraus & amp; Beste Grüße.
Ein paar Dinge zu überprüfen:
myTableHeaderView muss auch ein IBOutlet sein oder in Ihrer Klasse irgendwo in Code erstellt werden
self.myTableHeaderView darf nicht null sein, wenn Sie versuchen, sie als Tabellenkopfansicht hinzuzufügen. Wenn es Null ist, haben Sie Ihre Steckdosen nicht richtig angeschlossen
Wenn Sie den Header der Tabellenansicht in IB in seiner eigenen .xib-Datei entworfen haben, müssen Sie ihn irgendwo aufrufen (viewDidLoad ist ein guter Ort):
%Vor%
Der Besitzer der Datei MyTableViewHeader.xib muss Ihre TableViewController-Unterklasse sein, und Sie müssen das myTableHeaderView-Objekt mit der entsprechenden Steckdose des Dateieigners verbinden.
BEARBEITEN: als Antwort auf "was macht [[NSBundle mainBundle] loadNibNamed:@"MyTableViewHeader" owner:self options:nil];
"?
Diese kleine Zeile enthält die Magie, die Ihre Augen für die Zusammenarbeit von XIB-Dateien und Objective-C-Objekten in Cocoa (touch) öffnet und Ihr iOS-Programming-Kung-Fu auf ganz neue Ebenen hebt. Es gibt zwei Klassen von Cocoa-Programmierern, die verstehen, was sie tut und nutzt und davon profitiert, und diejenigen, die noch nicht wissen, was sie vermissen und stattdessen durch die Wildnis stolpern und versuchen, XIB-Dateien für ihre Objekte zu erstellen nie ganz zur Arbeit zu bringen.
Mit diesem massiven Aufbau sind hier die Details:
Eine XIB (NIB) -Datei ist eine Sammlung von archivierten Objective-C-Objekten (und Verweis auf Objekte, die nicht wirklich in der XIB sind, wie "File's Owner", ein sogenanntes "Proxy-Objekt") und Verbindungen zwischen diesen Objekten. Wenn eine XIB-Datei geladen wird, werden diese archivierten Objekte genau in dem Zustand zum Leben erweckt, in dem sie in der XIB gespeichert wurden, und dann werden die Verbindungen zwischen diesen Live-Objekten (und "Proxy-Objekten") hergestellt zu den in der XIB-Datei aufgezeichneten Verbindungen.
In Ihrer standardmäßigen UIViewController-Unterklasse .xib-Datei haben Sie beispielsweise den Eigentümer der Datei auf Ihre MyViewController-Klasse eingestellt. Innerhalb der .xib befindet sich ein UIView-Objekt, das normalerweise selbst andere UIKit-Objekte enthält. Die "View" -Ausgabe der UIViewController-Klasse wird so eingestellt, dass sie auf das UIView-Objekt in der .xib verweist. Wenn diese .xib-Datei geladen wird, wird das UIView-Objekt aus dem Archiv entfernt und zu einem lebendigen UIView-Objekt mit allen in der .xib aufgezeichneten Eigenschaften und Einstellungen. Das ist der "unarchivierende Teil".
Und dann , wegen der Verbindung in der .xib vom Eigentümer der Datei (MyViewController-Klasse) zum UIView-Objekt wird der Zeiger auf dieses neue UIView-Objekt im "view" -Feld Ihres MyViewController-Instanz. Alle anderen Verbindungen, die auch in der .xib-Datei vorhanden sind, wie UILabels, UIButton-Aktionen usw., werden ebenfalls für alle anderen "IBOutlet" -Felder in MyViewController eingerichtet.
Das alles scheint wie Magie und geschieht mit dem
%Vor%Methode, wenn Sie eine neue UIViewController-Unterklasse initiieren.
Nun zum guten Teil: Sie können diese Art von Nib-Dateien selbst mit Objekten verknüpfen! Sie können die loadNibNamed:owner:options
-Methode verwenden, um eine beliebige .xib-Datei mit einem passenden Satz von nil IBOutlets in einem beliebigen Objekt zu verknüpfen, das Sie wollen !!!
Ganz plötzlich ist das Erstellen völlig benutzerdefinierter Tabellenansichtszellen, Tabellenkopfzeilen, Fußzeilen usw. problemlos möglich. Sie können problemlos modulare wiederverwendbare UIView-Komponenten usw. schreiben, die alle in Interface Builder erstellt wurden.
Das Objekt, dessen nil IBOutlets mit Objekten gefüllt werden soll, die aus einer .xib-Datei geladen werden, ist das "Eigentümer" -Objekt. Normalerweise (aber ich bin mir nicht sicher, ob dies unbedingt erforderlich ist, any -Klasse mit den identisch typisierten und benannten IBOutlets, die auf File's Owner gesetzt sind), das ist die Klasse, die als "File's Owner" angegeben wird in der XIB.
OK, jetzt haben Sie Ihr vorhandenes Eigentümerobjekt mit nil IBOutlets (die IBOutlets müssen nil sein oder sie werden nicht geändert, das ist die "Regel" des Ladens von XIBs in ein Eigentümerobjekt. Es ist in Ordnung, dass einige IBOutlets sind nicht nil, sie werden nur nicht geändert, wenn Sie die XIB-Datei laden, und das ist normalerweise das, was Sie wollen), und Sie haben Ihre .xib-Datei mit Objekten, die Sie in das Eigentümerobjekt laden wollen. Du rufst an:
%Vor%.. und voila! Nun wurden alle nil IBOutlets in "theOwner", die mit Objekten in der MyXIBFileToLoad.xib verbunden sind, auf die neuen Objekte eingestellt, die aus der XIB-Datei geladen wurden.
(auch diese Methode gibt ein Array aller Objekte zurück, die von der XIB entfernt wurden. Wenn Sie die Steckdosen eines Besitzers nicht festlegen möchten, können Sie diese Liste nach Klassen und nach Tag durchsuchen).
>Also, das ist die Geschichte, jetzt werden Sie verrückt nach neuen Möglichkeiten, Objective-C-Klassen mit Objekten zu verknüpfen, die in XIB-Dateien gespeichert sind!
Tags und Links objective-c iphone