Was macht addChildViewController eigentlich?
Ich bin nur Tauchen meine Füße zum ersten mal in der iOS-Entwicklung, und eines der ersten Dinge, die ich habe zu tun ist, implementieren Sie eine custom container view controller - nennen wir es SideBarViewController
- , swaps aus, welche von mehreren möglichen Kind-view-Controller zeigt es, fast genau wie ein standard - Tab Bar Controller. (Es ist ziemlich viel Tab Bar Controller aber mit einem ausblendbar Seite im Menü statt einer tab-Leiste.)
Gemäß den Anweisungen in der Apple-Dokumentation, rufe ich addChildViewController
immer, wenn ich ein Kind ViewController zu meinem container. Mein code für das austauschen der aktuellen child-view-controller durch das SideBarViewController
sieht wie folgt aus:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Dann begann ich zu versuchen, herauszufinden, genau das, was addChildViewController
hier macht, und ich realisierte, dass ich keine Ahnung habe. Neben dem Aufkleben der neuen ViewController
im .childViewControllers
array, es scheint keinen Einfluss auf irgendetwas. Aktionen und Filialen aus der untergeordneten Steuerung aus Sicht des Kindes controller, den ich eingestellt habe auf dem storyboard noch gut funktionieren, auch wenn ich nie anrufen addChildViewController
und ich kann mir nicht vorstellen, was es beeinflussen könnte.
In der Tat, wenn ich meinen code umschreiben um nicht nenne addChildViewController
und stattdessen wie folgt Aussehen...
- (void)showViewController:(UIViewController *)newViewController {
//Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
... dann ist meine app noch einwandfrei funktioniert, so weit ich erzählen kann!
Die Apple-Dokumentation nicht viel vergossen Licht auf das, was addChildViewController
tut, oder warum sollen wir es nennen. Der gesamte Umfang der jeweiligen Beschreibung, was die Methode macht oder warum es verwendet werden soll, in seinem Abschnitt in der UIViewController
- Klasse Referenz ist, zu präsentieren:
Fügt den angegebenen view-controller, wie ein Kind.
...
Diese Methode soll nur aufgerufen werden, indem eine Implementierung eines custom container view controller. Wenn Sie diese Methode überschreiben, müssen Sie super in Ihrer Umsetzung.
Gibt es auch in diesem Absatz zuvor auf der gleichen Seite:
Ihren container view controller muss die Zuordnung einer untergeordneten view-controller mit sich selbst, bevor Sie das Kind das root-Ansicht, die view-Hierarchie. Dies ermöglicht iOS ordnungsgemäß Ereignisse auf der route an untergeordnete view-Controller und die Aussicht auf diesen Controller verwalten. Ebenso, nachdem es entfernt ein child der root-Ansicht aus der Sicht der Hierarchie, sollte es trennen, dass untergeordnete view-controller von selbst. Zu machen oder brechen diese Verbände, Ihre container ruft bestimmte Methoden definiert, die von der Basisklasse. Diese Methoden sind nicht dazu gedacht, genannt zu werden, indem Kunden Ihre container-Klasse; Sie sind nur zur Verwendung durch die container-Implementierung zu erwartenden Eindämmung Verhalten.
Hier sind die wesentlichen Methoden, die Sie benötigen könnten, zu nennen:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
aber nicht bieten, keine Ahnung, was die 'Ereignisse' oder 'erwartet containment-Verhalten', dass es reden sind, oder warum (oder auch wenn) den Aufruf dieser Methoden ist der 'wesentlichen'.
Die Beispiele für benutzerdefinierte container-view-Controller in den "Custom Container View Controller" - Bereich der Apple-Dokumentation alle rufen Sie diese Methode auf, so dass ich davon ausgehen, dass es dient einigen wichtigen Zweck mehr als nur knallen, das Kind ViewController auf ein array, aber ich kann nicht herausfinden, was dieser Zweck ist. Was macht diese Methode zu tun, und warum soll ich es nennen?
InformationsquelleAutor der Frage Mark Amery | 2013-06-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich wunderte mich über diese Frage zu. Ich sah Sitzung 102 von der WWDC 2011 videos und Herr View-Controller, Bruce D. Nilosagte dieser:
So scheint es, dass der Aufruf zu
addChildViewController:
sehr wenig. Die Nebenwirkungen des Aufrufs sind der wichtige Teil. Sie kommen aus derparentViewController
undchildViewControllers
Beziehungen. Hier sind einige der Nebenwirkungen, die ich kenne:transitionFromViewController:toViewController:…
wo sowohl die VCs müssen dieselbe übergeordnetenavigationController
tabBarController
usw EigenschaftenInformationsquelleAutor der Antwort nevan king
Ich denke, ein Beispiel sagt mehr als tausend Worte.
Ich ein library-app und wollte zeigen einen schönen Editor-Ansicht wird angezeigt, wenn der Benutzer will eine Notiz hinzufügen.
Nach dem Versuch, einige Lösungen, landete ich das erfinden meiner eigenen Lösung zu zeigen, die den Editor. Also, wenn ich zeigen will das Editor-erstelle ich eine neue Instanz von
NotepadViewController
und fügen Ihrer root-Ansicht als unteransicht der Hauptansicht. So weit So gut.Dann bemerkte ich, dass die Editor-Bild ist teilweise versteckt unter der Tastatur im landscape-Modus.
So, ich wollte zum ändern der Editor-image und verschieben Sie Sie bis. Und so zu tun, schrieb ich den richtigen code in
willAnimateRotationToInterfaceOrientation:duration:
Methode, aber bei mir lief die app ist nichts passiert! Und nach dem Debuggen habe ich bemerkt, dass keiner vonUIViewController
's rotation Methoden tatsächlich aufgerufen wird, inNotepadViewController
. Nur die Methoden in der main-view-controller aufgerufen werden.Um dieses Problem zu lösen, ich brauchte, um Anruf alle Methoden von
NotepadViewController
manuell, wenn Sie genannt werden, in der Haupt-view-controller. Dies wird bald die Dinge kompliziert machen, und erstellen Sie eine zusätzliche Abhängigkeit zwischen nicht verwandten Komponenten in der app.War das in der Vergangenheit, bevor das Konzept der child-view-Controller eingeführt wird. Aber jetzt, Sie müssen nur
addChildViewController
auf die main view-controller und alles wird nur funktionieren, wie erwartet, ohne weitere manuelle Arbeit.Edit:
Es gibt zwei Kategorien von Ereignissen, die weitergeleitet werden an untergeordnete view-Controller:
1 - Darstellung Methoden:
2 - Rotation Methoden:
Können Sie auch Steuern, welche event-Kategorien, die Sie wollen, werden, weitergeleitet, automatisch durch überschreiben
shouldAutomaticallyForwardRotationmethods
undshouldAutomaticallyForwardAppearancemethods
.InformationsquelleAutor der Antwort Hejazi
-[UIViewController addChildViewController:]
nur fügt die übergebene view-controller in einem array des viewControllers, dass ein viewController (die Eltern) halten will-Referenz. Sie sollten eigentlich diejenigen hinzuzufügen, die viewController der views auf dem Bildschirm selbst, indem Sie Sie als Unteransichten einer Ansicht (z.B. die parentViewController Ansicht). Es gibt auch eine Komfort-Objekt im Interface Builder zu verwenden childrenViewControllers in Storyboards.Zuvor, um Referenz von anderen viewControllers von welchen Sie die Aussicht auf, Sie musste immer manuell Referenz Sie im @ - Eigenschaften. Mit einem build-in-Eigenschaft, wie
childViewControllers
und folglichparentViewController
ist ein bequemer Weg, um zu verwalten diese Wechselwirkungen und bauen komponierte viewControllers, wie die UISplitViewController, die Sie auf iPad-apps.Darüber hinaus childrenViewControllers auch automatisch erhalten alle system-Ereignisse, die von den Eltern erhält: -viewWillAppear, -viewWillDisappear, etc. Zuvor sollten Sie genannt haben, diese Methoden manuell auf Ihrem "childrenViewControllers".
Das ist es.
InformationsquelleAutor der Antwort Gianluca Tranchedone