2012-04-08 18 views
2

Wenn ein View-Controller zum ersten Mal instanziiert wird, erstellt er normalerweise Objekte, die während seiner Lebensdauer benötigt werden. Es sollte keine Ansichten oder Objekte erstellen, die dem Anzeigen von Inhalten zugeordnet sind. Es sollte auf Datenobjekte und Objekte fokussieren, die zum Implementieren anderer kritischer Verhaltensweisen benötigt werden.Initialisieren eines View-Controllers

Das Obige ist aus der IOS Referenz:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10

Die Dokumentation für eine Sicht Ladesequenz mit Storyboard zu beschreiben geht.

Meine Frage lautet:

Da ein View-Controller mit einer Nib-Datei in Verbindung gebracht werden, die Anzeigeobjekte enthält; Und seine "viewDidLoad" -Methode scheint für das Konfigurieren von Ansichtsobjekten beim Laden entworfen zu sein. So sollte, wie der Vorschlag der Dokumentation:

„nicht erstellen Ansichten oder Objekte im Zusammenhang mit Anzeige von Inhalten“

interpretiert werden?

Ist Frage 1 damit zusammen, ob wir Storyboard verwenden oder nicht?

Antwort

1

Nicht sicher ich Ihre Frage richtig, aber hier ist meine Erklärung:

  1. init ialization und Ansichtserstellung sind zwei getrennte Schritte. Angenommen, ich habe einen View-Controller mit der Tabelle IBOutlet, der eine Liste der in den Core-Daten gespeicherten Rezepte anzeigen soll. In meiner Initialisierungsmethode würde ich die Daten von CoreData holen und in einem Array speichern oder Ergebnis-Controller abrufen. Ich benötige keine Tabelle dafür, folglich tue ich nichts mit self.view Eigenschaft (die die viewDidLoad aufruft, wenn es noch keine Ansicht gibt). In viewDidLoad rufe ich [tableView reloadData] an, um die Zellen neu zu zeichnen, damit sie die Daten von meinem Controller anzeigen, der in Initialisierer des Controllers erstellt wird.

  2. Ich denke nicht, dass es verwandt ist, aber Storyboard sollte nur Gerüst für Ihre View-Controller sein, die separate Nibs durch einzelne Datei ersetzen.

+0

Danke für die Antwort, @Eimantas. Wie Sie meinen, hat die Dokumentation möglicherweise dazu geführt, dass die Ansichtsobjekte in NIB-Dateien erstellt werden, bevor sie von den View-Controllern geladen werden. – Stanley

+0

@Stanley Wenn View-Controller mit Nib instanziiert wird, wird die Nib-Datei in den Speicher ausgelagert. Dort ruft jede Ansicht die Aufrufe "initWithCoder:" und "watchFromNib" auf. Dann erhalten Sie den Aufruf "viewDidLoad", nachdem alle Ausgänge und Aktionen verbunden sind. – Eimantas

+0

Vielen Dank für Ihre freundliche Unterstützung und detaillierte Antwort ... :) – Stanley

1

Die Aussage, die Sie zitiert haben, hat viel mit der Begrenzung und Effizienz von Mobilgeräten zu tun. Es bezieht sich nicht speziell auf Storyboard.

Durch "instanziieren" bedeutete die Dokumentation den Aufruf -(id)init;. Wenn dies geschieht, "bereitet der Controller kritische Daten vor, erstellt jedoch keine Ansichten". Dies bedeutet, dass der Controller eine XIB-Datei auswertet und bei der Initialisierung eine interne hierarchische Darstellung der Ansichten erstellt. Dieser Schritt beinhaltet nur RAM und CPU.

Der View-Controller erstellt nur Ansichten, wenn er in den Navigations-Controller gedrückt wird, oder zeigt eine Übergangsanimation an (dann wird viewDidLoad angezeigt). Dies ist weil Ansichten teuer sind. Es beinhaltet GPU und Video-RAM.Video-RAM ist viel begrenzter als RAM, es ist nicht effizient, nur Ansichten zu erstellen (Back-Buffer in VRAM), wenn es nicht angezeigt werden muss.

Wenn Sie sich Ihr Projekt ansehen, sollten Sie feststellen, dass einige View-Controller initialisiert werden, aber nicht sofort angezeigt werden müssen. Ohne ein solches Design wird VRAM ohne Grund schnell leer.

+0

Ein View-Controller schaut nicht auf seine Feder oder evaluieren sie in Init. Dies geschieht in loadView. Die Übertragung von Daten an die GPU geschieht, wenn die Ansicht zu einem sichtbaren Fenster hinzugefügt wird, was nach dem Zurückkehren von viewDidLoad geschieht. –

+0

@robmayoff, danke für die Eingabe. Ein View-Controller hat also während '' init'' nicht viel gemacht. –

+0

Danke, Shiming und Rob, für die detaillierte Analyse in Ihrer Antwort und Kommentare ... – Stanley

Verwandte Themen