Утечка просмотров при изменении rootViewController внутри transitionWithView

При исследовании утечки памяти я обнаружил проблему, связанную с техникой вызоваsetRootViewController: внутри блока анимации перехода:

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

Если старый контроллер представления (тот, который заменяется) в настоящее время представляет другой контроллер представления, то приведенный выше код не удаляет представленное представление из иерархии представления.

То есть эта последовательность операций ...

X становится Root View ControllerX представляет Y, так что вид Y на экранеС помощьюtransitionWithView: сделать Z новым Root View Controller

... выглядит хорошо для пользователя, но инструмент Debug View Hierarchy покажет, что представление Y по-прежнему находится позади представления Z, внутриUITransitionView, Таким образом, после трех шагов выше, иерархия представления:

UIWindowUITransitionViewUIView (вид Y)UIView (вид Z)

Я подозреваю, что это проблема, потому что во время перехода представление X фактически не является частью иерархии представления.

Если я отправлюdismissViewControllerAnimated:NO к Х непосредственно передtransitionWithView:результирующая иерархия представления:

UIWindowUIView (вид X)UIView (вид Z)

Если я отправлюdismissViewControllerAnimated: (ДА или НЕТ) в X, затем выполните переход вcompletion: блок, то иерархия представления верна. К сожалению, это мешает анимации. Если оживление увольнения, это пустая трата времени; если не анимация, это выглядит сломанным.

Я пробую некоторые другие подходы (например, создание нового класса контроллера представления контейнера, чтобы служить моим корневым контроллером представления), но не нашел ничего, что работает. Я буду обновлять этот вопрос, как я иду.

Конечная цель - перейти непосредственно от представленного представления к новому корневому контроллеру представления, не оставляя посторонних иерархий представлений.

Ответы на вопрос(4)

Ваш ответ на вопрос