In der WWDC 2011 Session 102 führte Apple - View - Controller Containment, das ist die Fähigkeit, benutzerdefinierte - View - Controller - Container, analog zu schaffen UITabBarController
, UINavigationController
und dergleichen.
Ich habe mir die Beispiele mehrmals angesehen. Es gibt eine Reihe von Methoden, die mit diesem Muster verbunden sind, aber es war ein wenig schwierig, sie genau herauszufinden. Ich werde hier posten, was meiner Meinung nach vor sich geht, und sehen, ob die Community meinen Verdacht bestätigt oder nicht bestätigt.
Szenario 1: Wechsel von keinem übergeordneten zu einem neuen übergeordneten Ansichtscontroller
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Müssen die ersten beiden Zeilen in der angegebenen Reihenfolge auftreten oder können sie umgekehrt werden?
Szenario 2: Wechsel von einem übergeordneten Ansichtscontroller zu keinem übergeordneten Ansichtscontroller
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Muss man auch anrufen [vc didMoveToParentViewController:nil]
? Die Beispiele in Sitzung 102 haben dies in diesem Szenario nicht getan , aber ich weiß nicht, ob dies eine Auslassung war oder nicht.
Szenario 3: Wechseln von einem übergeordneten Ansichtscontroller zu einem anderen
Dies wird wahrscheinlich auf folgende Weise geschehen, da die Logik in jedem übergeordneten Ansichtscontroller gekapselt wird.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Fragen
Meine Hauptfrage lautet: Sollte View Controller-Containment im Allgemeinen so funktionieren? Sind die oben angegebenen Mechaniken korrekt?
Ist es notwendig anzurufen, willMoveToParentViewController
bevor Sie anrufen addChildViewController
? Dies scheint mir die logische Reihenfolge zu sein, aber ist es unbedingt notwendig?
Ist es notwendig , rufen didMoveToParentViewController:nil
nach dem Aufruf removeFromParentViewController
?
addChildViewController
sollte also ausgeglichen seindidMoveToParentViewController
undwillMoveToParentViewController
sollte ausgeglichen sein mitremoveFromParentViewController
. Genau das habe ich gesucht. Ich bin mir nicht sicher, wie ich es in den Dokumenten verpasst habe.