2016-07-16 10 views
0

Xcode mit der Projektdatei und Info.plist lokalisiert das main.storyboard und findet den ursprünglichen ViewController. Aber ich hatte gehofft, in AppDelegate für den ViewController einen Kesselplattencode zu sehen.Wie setzt Xcode rootViewController implizit über Storyboard?

AppDelegate sieht leer: (kein Hinweis auf Viewcontroller)

@implementation AppDelegate  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    return YES; 
} 

... 

@end 

Storyboard ist xml: enter image description here

Frage

Does Xcode was magisch code zu beziehen storyboard xml und finde den controller?

Nach der Kompilierung ruft main() AppDelegate auf, das entweder direkt auf ViewController verweisen oder ein Proxy-Storyboard-Objekt zum ViewController haben sollte.

Was fehlt mir?

+0

Ich denke, diese Frage einen Mehrwert und die Antworten sind erstaunlich. –

Antwort

1

Ich glaube, mein Buch (die Sie bereits gefunden) es vollständig erklärt. main ruft UIApplicationMain() und es folgt bestimmte Regeln. Wenn Sie einen Hauptstoryboard in Ihrem Info.plist bezeichnet haben - und Sie tun - dann:

  • UIApplication zieht die Anfangs-View-Controller Instanz (die mit dem Einspeisepunkt Pfeil) aus dem Storyboard. Das ist die ViewController-Instanz.

  • Es instanziiert auch die UIApplication-Klasse.

  • Es instanziiert auch die App-Delegate-Klasse (im Aufruf UIApplicationMain angegeben) und weist sie der UIApplication-Eigenschaft delegate zu.

  • Es macht ein Fenster und weist ihn der window Eigenschaft AppDelegate ordnet dann die View-Controller an die rootViewController Eigenschaft des Fensters.

  • Dann zeigt es das Fenster (und ruft applicationDidFinishLaunching... auf dem App-Delegate ").

Das erklärt den Startvorgang vollständig.

+0

Hi matt, auf welches Buch beziehst du dich? Ich würde gerne lernen, wie sich die Punkte zumindest auf hohem Niveau verbinden. Diese Erklärung war sehr hilfreich. Ich finde alle Erklärungen zu bestimmten Klassen, aber nicht viel darüber, wie Xcode implizit eine Rolle in der App spielt. –

+1

http://www.apeth.com/iOSBook/ch06.html Stoppen Sie, Xcode zu sagen. Xcode spielt keine Rolle. Sie kompilieren und erstellen mit Xcode. Sie laufen auf der Laufzeit. Die Laufzeit tut dies. Weißt du, Kakao. Sie rufen UIApplicationMain und _das ist was es tut _. Ich verstehe nicht, warum das schwer ist. Du hast es schon dreimal von drei verschiedenen Leuten erfahren. – matt

+1

Danke für die Korrektur, Xcode baut gerade. Der auf den Storyboards basierende Interface-Builder erscheint zunächst magisch und die Benutzeroberfläche wird von Xcode bereitgestellt, so dass es wie sein Xcode aussieht. –

0

Ein Bild sagt mehr als tausend Worte. Hier ist jedoch eine kurze Beschreibung: "Es ist in Ihrem Projekt Einstellungen/info.plist".

In dem Bild unten "Main" ist der Name meines ersten Storyboards. Außerdem haben die ersten View-Controller ein Flag im Interface-Builder, das sagt "Is Initial View Controller", um zu sagen, dass dies der View-Controller ist, den Sie zuerst ausführen möchten.

P.S. sie einem Klick auf die Bilder vergrößert :)

enter image description here

enter image description here

enter image description here

+0

Hallo Brandon, das ist wirklich hilfreich und beantwortet in gewissem Maße die Frage. Ich möchte verstehen, was ist der Kontrollfluss während des Builds. Es scheint, dass Info.plist das Manifest für die App ist. Wo kann ich lesen, wie navigiert xcode durch die App-Architektur, um die App zu kompilieren? –

+0

XCode ist nur ein IDE/Build-System. Clang ist der Compiler, mit dem Ihre App kompiliert wird. – Brandon

+0

Gefunden diese http://www.apeth.com/iOSBook/ch06.html ein wenig tiefer zu erklären. (War hilfreich) –

1

Die kurze Antwort ist, dass die dynamische Natur von Objective-C ermöglicht UIApplicationMain() Ihre Anwendung nur von den Textinformationen in der Anwendung Datei und Ihre Haupt NIB oder Haupt Storyboard gespeichert werden. Der Compiler muss keinen Standardcode generieren.

Die längere Antwort:

UIApplicationMain führt die folgenden Dinge durch die Objective-C-Laufzeit:

  • In allen Fällen instanziiert UIApplicationMain() die NSPrincipalClass Schlüssel in der plist, in der Regel UIApplication kann aber sein, eine benutzerdefinierte Unterklasse

  • In einer NIB-less-Anwendung im alten Stil instanziiert UIApplicationMain() die AppDelegate-Klasse, die in main.m angegeben wurde. Es wird die AppDelegate zu UIApplication, verkabelt und dann an den AppDelegate Hand von den App-Fenster, root-View-Controller usw.

  • In einer NIB-basierten Anwendung zu erstellen, UIApplicationMain weiß nicht, den Namen des AppDelegate. Stattdessen lädt es Ihre Haupt-NIB-Datei NSMainNibFile, wie in der PLIST angegeben. Die NIB ist verantwortlich für die Instanziierung Ihres AppDelegate und die Verkabelung mit UIApplication sowie für die Erstellung Ihres Hauptfensters und Root View Controllers.

  • In einer Storyboard-Anwendung instanziiert UIApplicationMain den und den Anwendungsdelegaten wie in main.m angegeben, genau wie eine NIB-lose Anwendung. Es lädt dann das Haupt-Storyboard, das weiß, wer der anfängliche View-Controller ist. Er erstellt ein Fenster, instanziiert den ursprünglichen Ansichtscontroller und weist ihn als Root-Ansichtscontroller für das Fenster zu.

+0

Wow tolle Erklärung der 3 Generationen von App-Start-Prozess :) –

0

Das ist der Grund dahinter: -

enter image description here

und wenn Sie diese Markierung entfernen Sie werden einen leeren Bildschirm bekommen.

+0

Danke für die Antwort, eigentlich habe ich mich gefragt, wie AppDelegate darüber erfahren. Xcode ist nur eine IDE. –

+0

Ich glaube nicht, dass ich den dahinterliegenden Prozess erklären kann, da ich auch Anfänger bin und etwas lerne, aber vielleicht wird dies einige Methoden auslösen, die Methoden für die anfängliche Sicht schaffen. @YugalJindle – dreamBegin

Verwandte Themen