2009-05-25 7 views
3

Als Neuling ist IB und alle möglichen Verbindungen verwirrend für mich. Die meisten Tutorials, die ich gefunden habe, sind die Reinkarnation von Spaghetti-Code, bei der die Verschränkung alle durch Ziehen erzeugten Verbindungen sind. Natürlich möchte ich IB für das Layout von Ansichten verwenden (Größe & Platzierung von visuellen Elementen), das ist, was IB ist toll für. Aber ein Controller ist keine Ansicht, daher ist es weniger verwirrend, wenn alle meine Controller nur Code sind und nirgendwo in IB erscheinen. Ich vermute, das wird die Spaghetti minimieren. Es ermutigt auch die One-Xib-Per-View-Ermahnung. Zu diesem Zweck, und hier ist die Frage, wo kann ich Beispielprojekte finden, die dieser Strategie folgen?Wie man Controller aus xib heraus hält

Antwort

1

Gute Frage. Das Muster, mit dem ich mich bemühe, besteht darin, den Controller im Code zu machen, IBOutlets und IBActions für die Dinge in der XIB/NIB, die mit diesem Code interagieren, und eine Sache im Konstruktor der Steuerung, die die XIB/NIB mit "self" lädt der Besitzer, und in IB verbinde ich Sachen mit dem Platzhalter "File's Owner", dessen Identität ich als die Klasse meines Controllers angegeben habe.

4

Ich habe nicht eine Reihe von Beispielprojekten, aber ich werde Ihnen einige Informationen darüber geben, wie die Dinge funktionieren und wann Sie Controller in einer XIB-Datei oder in Code erstellen sollten.

Wenn Ihre Controller dynamisch über eine Benutzeraktion erstellt werden, werden Sie diese in der Regel nicht in einer XIB-Datei instanziieren. Stattdessen werden Sie sie in Code instanziieren, wie oben erwähnt. Sobald Sie dies getan haben, benötigen Sie weiterhin einen Mechanismus, um diesen Controller, der in Code erstellt wurde, mit den Elementen der Benutzeroberfläche zu verbinden, die Sie in IB erstellt haben.

Der Mechanismus, den IB zur Lösung dieses Problems bietet, ist der Eigentümer der Datei. Das Beherrschen des Eigentümers der Datei ist wichtig, um den Interface Builder zu bekommen.

Der Besitzer der Datei ist kein Objekt, das sich in der XIB-Datei befindet, sondern ein Objekt, das in der XIB-Datei enthalten ist. Es ist ein Platzhalter für ein Objekt, das bereits vorhanden ist, wenn die XIB-Datei geladen wird. Wenn NIB-Dateien zur Laufzeit geladen werden, werden sie mit der NSBundle-Methode geladen - [NSBundle loadNibNamed: ownwer: options:]. Der Besitzerparameter wird verwendet, um das Besitzerplatzhalterobjekt der Datei in der XIB/NIB-Datei aufzulösen. Wenn die Datei zur Laufzeit geladen wird, werden alle Verbindungen, die mit dem Eigentümer der Datei hergestellt wurden, mit dem Objekt aufgelöst, das Sie als Besitzerparameter an die NSBundle-Methode übergeben haben. Auf dem iPhone laden Sie die NIB-Datei normalerweise nicht selbst. Stattdessen erledigt UIViewController das für Sie. Die Standardimplementierung von UIViewController des Loadview-Methode könnte wie folgt aussehen:

- (void)loadView { 
    [[self nibBundle] loadNibNamed:[self nibName] owner:self options:nil]; 
} 

So, indem Sie die Elemente in Ihrer XIB-Datei in die Akten der Besitzer verbindet, werden Sie sie auf Ihren View-Controller werden zu verbinden.

Sie haben einige Controller, die statisch in Ihrer Anwendung sind - sie werden für immer am Leben sein. Ein Navigations- oder Tab-Controller mitsamt seinen Root-Elementen ist typischerweise für die gesamte Lebensdauer seiner Anwendung aktiv. Wenn das der Fall ist, würde ich diese Ansichtscontroller in der MainWindow.xib-Datei einrichten. Die meisten anderen Controller würden dynamisch und programmatisch als Reaktion darauf erstellt, dass der Benutzer Dinge tut.

+0

Danke, Jon, das ist hilfreiche Informationen. Ich möchte immer noch die Strategie ausprobieren, niemals Controller auf der IB-Seite zu haben. Würdest du zustimmen, dass es machbar ist? Ich suche immer noch nach Codebeispielen ... – bedouger

+0

Alles ist machbar. Aber ich würde den oben aufgeführten Ansatz empfehlen. Erstellen Sie statische Controller in der Datei MainWindow.xib und erstellen Sie die meisten (normalerweise alle) anderen Controller im Code als Reaktion auf Benutzeraktionen. –

Verwandte Themen