Ich tauche meine Füße zum ersten Mal in die iOS-Entwicklung, und eines der ersten Dinge, die ich tun musste, ist eine custom container view controller - nennen wir es SideBarViewController
- die austauscht, welche von mehreren möglichen Kind-View-Controller es zeigt, fast genau wie ein Standard Tab Bar Controller. (Es ist so ziemlich ein Tab Bar-Controller aber mit einem ausblendbar Seite Menü statt einer Tab-Leiste.)Was macht addChildViewController eigentlich?
gemäß den Anweisungen in der Apple-Dokumentation, ich addChildViewController
rufen, wenn ich ein Kind Viewcontroller zu meinem Container hinzufügen. Mein Code zum Austausch der aktuellen Kind-View-Controller aus der SideBarViewController
gezeigt wird, 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 versuche nur, um herauszufinden, was addChildViewController
hier der Fall ist, und ich erkannte, dass ich keine Ahnung habe. Abgesehen davon, dass das neue ViewController
im Array .childViewControllers
steckt, scheint es nichts zu bewirken. Aktionen und Ausgänge von der Ansicht des Kind-Controllers zu dem Kind-Controller, die ich auf dem Storyboard eingestellt habe, funktionieren immer noch gut, auch wenn ich nie addChildViewController
aufrufen, und ich kann mir nicht vorstellen, was es sonst beeinflussen könnte. Tatsächlich
, wenn ich meinen Code neu schreiben, um nicht addChildViewController
zu nennen, 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 meine app funktioniert immer noch einwandfrei, soweit ich das sagen kann!
Die Apple-Dokumentation wirft nicht viel Licht auf was addChildViewController
tut, oder warum wir es nennen sollen. Das gesamte Ausmaß der jeweiligen Beschreibung dessen, was die Methode tut oder warum sollte es im UIViewController
Class Reference in seinem Abschnitt verwendet werden, derzeit:
Fügt die angegebene View-Controller als Kind. ... Diese Methode soll nur von einer Implementierung eines benutzerdefinierten Containeransicht-Controllers aufgerufen werden. Wenn Sie diese Methode überschreiben, müssen Sie super in Ihrer Implementierung aufrufen.
Es gibt auch diesen Absatz früher auf der gleichen Seite:
Ihre Container-View-Controller ein Kind View-Controller mit mir selbst vor dem Hinzufügen des Kindes Root-Ansicht zu der Ansicht Hierarchie zuordnen müssen. Dadurch kann iOS Ereignisse ordnungsgemäß an untergeordnete Ansichtscontroller und die Ansichten, die diese Controller verwalten, weiterleiten. Nachdem es die Stammansicht eines untergeordneten Elements aus seiner Ansichtshierarchie entfernt hat, sollte es den untergeordneten Ansichtscontroller ebenfalls von sich selbst trennen. Um diese Zuordnungen zu erstellen oder zu brechen, ruft Ihr Container bestimmte Methoden auf, die von der Basisklasse definiert werden. Diese Methoden sollen nicht von Clients Ihrer Containerklasse aufgerufen werden. Sie dürfen nur von der Implementierung Ihres Containers verwendet werden, um das erwartete Containment-Verhalten bereitzustellen.
Hier sind die wesentlichen Methoden, die Sie nennen können müssen:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
aber es bietet keine Ahnung, was die "Ereignisse" oder "erwartetes Eindämmungsverhalten", von denen gesprochen wird, oder warum (oder sogar wann) diese Methoden aufgerufen werden, ist "wesentlich". Die Beispiele von benutzerdefinierten Containeransichtscontrollern im Abschnitt "Benutzerdefinierte Containeransichtscontroller" der Apple-Dokumentation rufen alle diese Methode auf. Daher nehme ich an, dass sie einen wichtigen Zweck erfüllt, nicht nur den untergeordneten ViewController auf ein Array zu setzen, sondern auch I kann nicht herausfinden, was dieser Zweck ist. Was macht diese Methode und warum sollte ich sie nennen?
Apples [** 2011 WWDC **] (https://developer.apple.com/videos/wwdc/2011/) Die Videoseite enthält eine große Sitzung ("Implementieren von UIViewController Containment") zu diesem Thema. – Alladinian