Bei der Untersuchung eines Speicherverlusts entdeckte ich ein Problem im Zusammenhang mit der Technik des Aufrufs setRootViewController:
in einem Übergangsanimationsblock:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
Wenn der alte Ansichtscontroller (der zu ersetzende) derzeit einen anderen Ansichtscontroller anzeigt, entfernt der obige Code die dargestellte Ansicht nicht aus der Ansichtshierarchie.
Das heißt, diese Abfolge von Operationen ...
- X wird zum Root View Controller
- X zeigt Y an, sodass die Ansicht von Y auf dem Bildschirm angezeigt wird
- Verwenden Sie
transitionWithView:
, um Z zum neuen Root View Controller zu machen
... sieht für den Benutzer in Ordnung aus, aber das Debug View Hierarchy-Tool zeigt an, dass die Ansicht von Y immer noch hinter der Ansicht von Z in a vorhanden ist UITransitionView
. Das heißt, nach den drei obigen Schritten lautet die Ansichtshierarchie:
- UIWindow
- UITransitionView
- UIView (Y's Ansicht)
- UIView (Zs Ansicht)
- UITransitionView
Ich vermute, dass dies ein Problem ist, da die Ansicht von X zum Zeitpunkt des Übergangs nicht Teil der Ansichtshierarchie ist.
Wenn ich dismissViewControllerAnimated:NO
unmittelbar zuvor an X sende , transitionWithView:
lautet die resultierende Ansichtshierarchie:
- UIWindow
- UIView (X's Ansicht)
- UIView (Zs Ansicht)
Wenn ich dismissViewControllerAnimated:
(JA oder NEIN) an X sende und dann den Übergang im completion:
Block durchführe, ist die Ansichtshierarchie korrekt. Leider stört das die Animation. Wenn die Entlassung animiert wird, wird Zeit verschwendet. Wenn es nicht animiert, sieht es kaputt aus.
Ich versuche einige andere Ansätze (z. B. eine neue Container-View-Controller-Klasse als Root-View-Controller zu erstellen), habe aber nichts gefunden, was funktioniert. Ich werde diese Frage aktualisieren, wenn ich gehe.
Das ultimative Ziel ist der direkte Übergang von der dargestellten Ansicht zu einem neuen Root-Ansichts-Controller, ohne dass hier Streuansichtshierarchien verbleiben.
UIWindow
Richtige ist, aber ich hatte nicht die Zeit, viel zu experimentieren.