web-dev-qa-db-de.com

Wie funktioniert View Controller Containment in iOS 5?

In der WWDC 2011 - Sitzung 102 wurde View Controller Containment Apple) eingeführt. Hierbei handelt es sich um die Möglichkeit, benutzerdefinierte View Controller - Container zu erstellen, analog zu UITabBarController, UINavigationController und mögen.

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 meine Vermutungen bestätigt oder entkräftet.

Szenario 1: Wechsel von einem ü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 vorkommen oder können sie umgekehrt werden?

Szenario 2: Wechsel von einem übergeordneten Ansichtscontroller zu einem nicht übergeordneten Ansichtscontroller

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

Ist es auch notwendig, [vc didMoveToParentViewController:nil]? Die Beispiele in Sitzung 102 haben dies in diesem Szenario nicht getan , aber ich weiß nicht, ob dies eine Unterlassung war oder nicht.

Szenario 3: Wechsel 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: Soll das Einschließen von View Controllern im Allgemeinen so funktionieren? Sind die oben angegebenen Mechaniken korrekt?

Müssen Sie willMoveToParentViewController aufrufen, bevor Sie addChildViewController aufrufen? Dies scheint mir die logische Reihenfolge zu sein, aber ist es unbedingt notwendig?

Ist es notwendig, didMoveToParentViewController:nil nach dem Aufruf von removeFromParentViewController?

107
Gregory Higley

Die UIViewController -Dokumente legen ziemlich genau fest, wann und wann willMove/didMove -Methoden aufgerufen werden sollen. Lesen Sie die Dokumentation "Implementieren eines Container View Controllers" .

In den Dokumenten heißt es, dass Sie die Methode willMoveToParentViewController: Nicht aufrufen müssen, wenn Sie addChildViewController nicht überschreiben. Sie müssen jedoch die Methode didMoveToParentViewController: Aufrufen, nachdem der Übergang abgeschlossen ist. "Ebenso liegt es in der Verantwortung des Containersicht-Controllers, die willMoveToParentViewController: - Methode aufzurufen, bevor die removeFromParentViewController -Methode aufgerufen wird. Die removeFromParentViewController -Methode ruft die didMoveToParentViewController: - Methode auf. Methode des Child View Controllers. "

Es gibt auch ein ausgearbeitetes Beispiel hier und einen Beispielcode hier .

Viel Glück

73
timthetoolman

Dieser Teil ist nicht korrekt:

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

Nach den Unterlagen:

Wenn Ihr benutzerdefinierter Container die Methode addChildViewController: aufruft, ruft er vor dem Hinzufügen automatisch die Methode willMoveToParentViewController: des Ansichtscontrollers auf, der als untergeordnetes Element hinzugefügt werden soll.

Sie brauchen also nicht den Aufruf [vc willMoveToParentViewController:self]. Dies geschieht automatisch, wenn Sie [self addChildViewController:vc] Aufrufen. Hier ist noch einmal das Codebeispiel:

[self addChildViewController:vc];
// [vc willMoveToParentViewController:self] called automatically
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

Zum Entfernen von View Controllern:

Die Methode removeFromParentViewController ruft automatisch die Methode didMoveToParentViewController: des untergeordneten Ansichtscontrollers auf, nachdem das untergeordnete Element entfernt wurde.

Vermutlich ist dieser Aufruf [oldVC didMoveToParentViewController:nil].

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// [vc didMoveToParentViewController:nil] called automatically
22
nevan king