Утечка просмотров при изменении 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
, Таким образом, после трех шагов выше, иерархия представления:
Я подозреваю, что это проблема, потому что во время перехода представление X фактически не является частью иерархии представления.
Если я отправлюdismissViewControllerAnimated:NO
к Х непосредственно передtransitionWithView:
результирующая иерархия представления:
Если я отправлюdismissViewControllerAnimated:
(ДА или НЕТ) в X, затем выполните переход вcompletion:
блок, то иерархия представления верна. К сожалению, это мешает анимации. Если оживление увольнения, это пустая трата времени; если не анимация, это выглядит сломанным.
Я пробую некоторые другие подходы (например, создание нового класса контроллера представления контейнера, чтобы служить моим корневым контроллером представления), но не нашел ничего, что работает. Я буду обновлять этот вопрос, как я иду.
Конечная цель - перейти непосредственно от представленного представления к новому корневому контроллеру представления, не оставляя посторонних иерархий представлений.