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
?
quelle
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.Dieser Teil ist nicht korrekt:
Laut den Dokumenten:
Sie brauchen den
[vc willMoveToParentViewController:self]
Anruf also nicht . Dies geschieht automatisch, wenn Sie anrufen[self addChildViewController:vc]
. Hier ist noch einmal das Codebeispiel:So entfernen Sie View Controller:
Vermutlich ist dieser Anruf
[oldVC didMoveToParentViewController:nil]
.quelle
didMoveToParentViewController
" unmittelbar nach dem Aufrufen der Methode addChildViewController:" nicht angibt, wann Sie die untergeordnete Unteransicht tatsächlich hinzufügen. Ich frage mich, ob jeder das falsch verstanden hat. Gibt es in einigen Apple Docs ein Beispiel, anhand dessen wir dies überprüfen können?willMoveToParentViewController
um voraddChildViewController
wenn das ausgewählte Element bewegt werden , ist eine benutzerdefinierte Klasse mit überschriebeneaddChildViewController
(es sei denn , der Überschreibung nennt es intern)