Frage

Ich habe Apples „Ihre erste iOS-Anwendung“ Leitfaden lesen und alles, was es scheint, kristallklar zu mir. wenn ich jedoch versuchen, wie View-basierte iOS Anwendungsvorlage in XCode arbeitet zur Verfügung gestellt zu verstehen, ich laufe in einige interessanten Rätsel.

Ich verstehe, dass die Anwendung die Hauptspitze Dateiname wird (in der Regel, die MainWindow.xib) bilden die * -Info.plist Datei. Was ich nicht verstehe, ist, wie funktioniert das XCode wissen, welche Nib-Datei mit dem Controller verbunden ist, die standardmäßig mit dieser View-basierten Anwendungsvorlage erstellt wird. In der Führung beginnen Sie mit der Window-basierten Anwendung, und Sie „schreiben müssen“ so etwas wie:

MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

[self setMyViewController:aViewController];

, die durchaus Sinn macht. Allerdings stellt sich heraus, dass in der View-basierten iOS Anwendungsvorlage gibt es nicht so etwas, und dass diese Feder Spezifikation wurde nicht tatsächlich in erster Linie erforderlich, solange Sie mit der Option „Mit XIB für Benutzeroberfläche Ihre UIViewController Unterklasse erstellt "geprüft. Meine Frage ist, wie funktioniert XCode wissen, welche Feder mit diesem Controller verbunden ist, das heißt es ist diese Verbindung in einige der Dateien zu speichern, oder vielleicht durch eine Art Konvention (gleichen Namen für Controller und Nib-Datei, vielleicht)? Außerdem woher kommt, dass ‚Loaded von‚MyViewBasedAppController‘‘ Untertitel aus kommen in Sicht des Interface Builder von Controller innerhalb MainWindow.xib? Es ist definitiv nicht da, wenn ich den Regler von Hand hinzufügen, so dass ich zu neugierig bin, was Magie ist XCode tun hinter meinem Rücken, wenn ich glaube, ich bin nur eine einfache Code-Vorlage auswählen.

War es hilfreich?

Lösung

Wenn Sie im Ziel info aussehen (Doppelklick auf dem Ziel, das bis zu bringen), Registerkarte ‚Eigenschaften‘ Sie den Namen der Haupt Nib-Datei. Die Worte ‚Nib‘ und ‚Xib‘ sind für diese Zwecke austauschbar; Xib ist nur eine neuere Alternative für Nib.

Es wird seine ‚Mainwindow‘ frisch aus der Vorlage. Wenn Sie MainWindow.xib öffnen werden Sie sehen, dass in es ein Objekt ‚[Projektname] App Delegate‘ genannt, und wenn Sie den Inspektor zeigen und prüfen Sie nach dem ‚i‘ Tab finden Sie den Typ der Klasse sehen, die ist an der Spitze genannt. Wenn Sie auf die Registerkarte Verbindungen überprüfen (die rechte Verkleidung Pfeil), werden Sie sehen, dass die Datei-Besitzer (die der UIApplication selbst) hat seine ‚Delegierten‘ Eigentum angebracht.

Sie werden auch sehen, dass es einen Auslass namens ‚Viewcontroller‘. Das ist auf ein anderes Objekt in der xib angebracht namens ‚[Projektname] View Controller‘. Überprüfen Sie den Typ auf das, und Sie werden sehen, es die Art der View-Controller ist, dass Xcode zu einem Projekt hinzugefügt. Mit Blick auf seine Attribute (die erste Registerkarte im Inspektor, mit dem Schieber Grafik), werden Sie auch sehen, dass eine separate nib-Datei als enthält, dessen Haupt Details angegeben ist.

Für Argument willen, nehme ich mein Projekt ‚NibTest‘ genannt und machte keine Änderungen.

Zur Laufzeit Info.plist das Gerät geladen wird. Dort sieht es, dass die Delegierten des Typs NibTestAppDelegate ist. So dass es dann eine Instanz der Klasse NibTestAppDelegate instanziiert und die UIApplication der Delegierten-Eigenschaft auf es festgelegt.

Es wird dann von MainWindow.nib sehen, dass NibTestAppDelegate ein Mitglied hat Viewcontroller vom Typ NibTestViewController benannt. So wird es eine Instanz, dass zu erstellen und die Eigenschaft Viewcontroller auf der NibTestAppDelegate Instanz festgelegt es ihm gerade erstellt haben.

Dabei, dass es die anderen xib öffnen werde und auch weiterhin tun, die gleiche Art von Schritten.

Objective-C verfügt über eine voll reflektierende Laufzeit, so dass Sie Objekte durch ihre Klassennamen zur Laufzeit instanziieren. Dies ist einer der Unterschiede zwischen Objective-C und C ++, zum Beispiel.

Xcode ist kein versteckten Code zu erzeugen oder auf irgendwelchen versteckten Namenskonventionen zu verlassen. Das Ganze wird durch das OS zur Laufzeit herausgefunden.

EDIT: zum Beispiel, anstelle von Ihrem Beispiel:

    MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

Sie könnte tatsächlich tun:

    MyViewController *aViewController = [[NSClassFromString(@"MyViewController") alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

Sie werden gleich arbeiten, solange MyViewController im Programm vorhanden ist oder in der weiteren Laufzeit.

Sie könnten alternativ andere String-Objekt übergeben Sie NSClassFromString mögen. Auch fragen Sie den Benutzer für sie, wenn Sie wollen (obwohl es eine wirklich schlechte Idee aus Sicherheitsgründen sein würde).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top