Bin ich missbraucht Unterklassen von UIViewController?
Versuchen, herauszufinden, warum viewWillAppear nicht genannt in meiner app stieß ich auf das, was kann ein grobes Missverständnis ich halte über die beabsichtigte Nutzung von UIViewController-Unterklassen.
Gemäß dem folgenden Beitrag viewWillAppear wird nicht ausgeführt, wenn mit addSubView! und den link zu diesem blog-post: http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/ Unterklassen von UIViewController sollte halt nur in ganz bestimmten Situationen. Vor allem, wenn direkt an die UIWindow, oder anderen Apple-eigene Controller wie UINavigationControllers.
Bin ich freilich schuldig, der addition der Ansichten von UIViewController-Unterklassen, um die Ansichten der anderen UIViewController-Unterklassen.
In der Tat, ich dachte, das war mehr oder weniger die ganze Idee von Apple ' s implementation von MVC im Allgemeinen... Eine Allgemeine VC, mit anderen VCs unter, alle glücklich, die immer Ihre delegate-Methoden aufgerufen.
Wenn es gibt eine Menge von Ansichten (die per definition benötigen, controlling) kommen und gehen in einer app, und viele screenfulls, in der das Modell beschrieben, in diesem post, jeder screenfull sollte eine master-VC-Unterklasse, mit allen Untersichten gesteuert, anstatt durch custom-Controller (das geschehen zu kontrollieren, sichten), die Unterklassen von einfache NSObject.
In diesem Fall, UIViewControllers sollte nur direkt an das Fenster oder UINavigationController, UITabBarController etc?
Sind Sie garantiert, um die UIVC Delegate-Methoden aufgerufen, in diesem Fall? Wie unterscheidet sich dies von der Berufung der Delegierte Methoden manuell, wenn ein viewcontroller ist der Ansicht, eine unteransicht eines anderen VC?
Ehrlich, dies scheint wie eine große Verschwendung von Zeit. Benutzerdefinierte Implementierungen der ViewDidLoad -, viewDidLoad, viewDidUnload, viewWillAppear, viewWillDisappear nicht zu erwähnen, sind so einfache Dinge wie Eigenschaften wie, sagen wir, "Ansicht"...
Also entweder bin ich vollkommen falsch, oder bin ich auf einem wild-goose chase. Wenn UIViewController-Unterklassen können nicht auf gezählt werden, um zu nennen, viewWillAppear, warum nicht einfach rufen Sie die Methode manuell, und mit ihm getan werden?
Warum replizieren alle die wahrgenommene Funktionalität von UIViewController?
- yup diese Tage (2014), die du trivial dies mit Behälter stackoverflow.com/a/23403979/294884 - cheers
- Soweit ich mich erinnere, das ist die Art, wie es getan für Kakao (nicht Cocoa Touch). Separate NSViewController Unterklassen für die verschiedenen Teile des UI. Aber sehr schöne Frage für Cocoa Touch, der mir geholfen hat, klar zu erkennen, dieser Unterschied!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf die Frage des Titels: ja.
Klingt es wie du schon völlig falsch. Der Begriff "Blick" hat ein paar verschiedene, aber Verwandte Bedeutungen:
Es klingt wie dein Missverständnis ist, auf diesem letzten Punkt. Ein view-controller sollten verwalten a single "vollen Bildschirm" von Inhalten. Wenn Sie eine single-view-controller-Objekt zu verwalten mehr als eine view-Hierarchie, oder, wenn Sie über mehrere view-Controller für die Verwaltung verschiedener Teile der gleichen view-Hierarchie, bist du mit UIViewController in einer Weise, die nie beabsichtigt war und die wahrscheinlich zu Problemen führen.
Den Methoden, die Sie erwähnt (-viewDidLoad, -viewWillAppear, etc.) gemeint sind, zu sagen, die Ansicht-controller, der seine Sicht auf die Hierarchie wurde nur geladen, angezeigt, und so weiter. Sie sind wirklich nicht dazu, um auf eine einzelne Untersicht, und es wäre ungewöhnlich für einen view-controller zu müssen, dass Informationen für einzelne Unteransichten. Wenn die view-Hierarchie geladen wurde, dann wird die view-controller weiß, dass alles, was in dieser Hierarchie geladen wurde.
Scheinen Sie zu sein die Interpretation dieser Methoden an delegate-Methoden, aber Sie sind es nicht. Eine Stellvertretung ist ein separates Objekt, das es ermöglicht für die Anpassung an die delegieren, ohne die Notwendigkeit für Unterklassen.
-viewDidLoad
und-viewWillAppear
sind zwei Beispiele der override-Punkte für UIViewController, eine Klasse, die bestimmt für Unterklassen. Der view-controller-Objekt ruft diese Methoden selbst zu geben Unterklassen eine chance, einige Maßnahmen zu ergreifen, an einem interessanten Punkt in der Steuerung des Lebenszyklus.Nehmen Sie einen guten Blick auf UIViewController und du wirst sehen, dass die meisten der Funktionalität zu tun hat mit der Darstellung der Ansicht (also die view-Hierarchie) auf dem Bildschirm oder mit der Integration der controller mit "container" - view-Controller wie UINavigationController und UITabBarController. Nichts davon ist nützlich, um Objekte, die nicht die Verwaltung des gesamten vollen Bildschirm Inhalt.
Manchmal passiert es, dass eine Gruppe von Ansichten wird repliziert auf mehrere Bildschirme, und in einigen von diesen Fällen ist es hilfreich, zu verwalten, der diese Ansicht mit einem Objekt, das getrennt von der view-controller selbst. Ich kann sehen, wie würden Sie versucht sein, zu verwenden UIViewController wegen seiner -viewDidLoad und ähnliche Methoden, aber diese sind wirklich nur ein kleiner Teil dessen, was UIViewController tut. Was würde es bedeuten, zu nennen
-presentModalViewController:
auf eines dieser Objekte? Oder Zugriff auf seinenavigationController
oderparentViewController
Eigenschaften?Wenn Sie wirklich wollen, zu verwalten Untersichten der view-controller view-Hierarchie mithilfe dieser Methoden, erstellen Sie eine Unterklasse von NSObject hat -viewDid[Load|Unload|Erscheinen|Verschwinden] und -viewWill[Erscheinen|Verschwinden] Methoden. Können Sie erstellen, die Klasse einmal und dann Unterklasse, so oft wie Sie benötigen, und keiner von Ihren "subcontroller" Klassen müssen alle zusätzlichen, nicht benötigte controller-management-Sachen, die zusammen mit UIViewController.
Edit: möchte ich hinzufügen, dass ein Zeiger, die hier zu Apple View Controller Programming Guide for iOS, die eine Menge Unterstützung für das, was ich habe, gelegt vor. Hier ist eine relevante passage aus dem Unterabschnitt mit dem Titel "View-Controller Verwalten einer View-Hierarchie":
View Controller Programming Guide ist Pflichtlektüre für jeden, auch nur daran zu denken zu schreiben, eine iOS-app. Es lohnt sich zu überprüfen, wenn Sie nicht gelesen haben, es in eine Weile (oder für immer).
Update: Ab iOS 5 ist es nun möglich, definieren Sie Ihre eigenen container view Controller, d.h. view-Controller zu verwalten, dass andere view-Controller und potenziell Anzeige der Ansichten von mehreren view-Controller zur gleichen Zeit. Sie können mehr darüber Lesen Sie in der oben verlinkten Handbuchs im Abschnitt Erstellen von Benutzerdefinierten Container View Controller. Nichts davon ändert sich wirklich die wesentlichen Punkte vor: eine single-view-controller sollten noch schaffen eine Hierarchie von sichten und Methoden, wie
-viewDidLoad
immer noch auf die gesamte Grafik anzeigen, anstatt auf einzelne Unteransichten. Die Beratung, dass eine view-controller verwaltet eine "gesamte vollen Bildschirm" der Inhalt ist nicht mehr ganz richtig-so wieUISplitViewController
angezeigt hat Inhalt von zwei view-Controllern gleichzeitig seit der Einführung des iPad, Ihre eigenen Behälter kann nun zeigen die Ansichten von mehreren child-view-Controller. Schreiben Sie einen container view controller ist ein etwas fortgeschrittenes Thema-Sie sollten sehr vertraut mit der Verwendung von view-Controllern im Allgemeinen und die Art und Weise der bereitgestellten Behälter view-Controller arbeiten, bevor Sie einen Stich an der Erstellung Ihrer eigenen.