Leaking Views beim Ändern von rootViewController in transformationWithView

Während der Untersuchung eines Speicherverlusts entdeckte ich ein Problem im Zusammenhang mit der AufruftechniksetRootViewController: innerhalb eines Übergangsanimationsblocks:

[UIView transitionWithView:self.window
                  duration:0.5
                   options:UIViewAnimationOptionTransitionFlipFromLeft
                animations:^{ self.window.rootViewController = newController; }
                completion:nil];

Wenn der alte Ansichtscontroller (der zu ersetzende) gerade einen anderen Ansichtscontroller anzeigt, wird die angezeigte Ansicht durch den obigen Code nicht aus der Ansichtshierarchie entfernt.

Das heißt, diese Abfolge von Operationen ...

X wird Root View ControllerX zeigt Y an, sodass die Ansicht von Y auf dem Bildschirm angezeigt wirdUsingtransitionWithView: um Z zum neuen Root View Controller zu machen

... sieht für den Benutzer in Ordnung aus, aber das Werkzeug "Hierarchie der Debug-Ansicht" zeigt, dass die Ansicht von Y noch hinter der Ansicht von Z in einem @ vorhanden isUITransitionView. Das heißt, nach den drei obigen Schritten lautet die Ansichtshierarchie:

UIWindow UITransitionViewUIView (Y's Ansicht)UIView (Zs Ansicht)

Ich vermute, dass dies ein Problem ist, da die Ansicht von X zum Zeitpunkt des Übergangs nicht wirklich Teil der Ansichtshierarchie ist.

Wenn ich sendedismissViewControllerAnimated:NO bis X unmittelbar vortransitionWithView:, die resultierende Ansichtshierarchie lautet:

UIWindowUIView (Ansicht von X)UIView (Zs Ansicht)

Wenn ich sendedismissViewControllerAnimated: (JA oder NEIN) zu X, dann führen Sie den Übergang imcompletion: block, dann ist die Ansichtshierarchie korrekt. Leider stört das die Animation. Wenn die Entlassung angeregt wird, wird Zeit verschwendet. Wenn es nicht animiert, sieht es kaputt aus.

Ich versuche einige andere Ansätze (z. B. das Erstellen einer neuen Container-View-Controller-Klasse als Root-View-Controller), habe aber nichts gefunden, was funktioniert. Ich werde diese Frage aktualisieren, wenn ich gehe.

Das ultimative Ziel besteht darin, direkt von der präsentierten Ansicht zu einem neuen Stammansichts-Controller überzugehen, ohne Streuansichts-Hierarchien zu hinterlassen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage