При исследовании утечки памяти я обнаружил проблему, связанную с методом вызова setRootViewController:
внутри блока анимации перехода:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
Если старый контроллер просмотра (тот, который заменяется), в настоящее время представляет собой другой контроллер представления, тогда приведенный выше код не удаляет представленный вид из иерархии представления.
То есть, эта последовательность операций...
- X становится контроллером Root View
- X представляет Y, так что Y вид на экране
- Используя
transitionWithView:
, чтобы сделать Z новым контроллером Root View
... выглядит хорошо для пользователя, но инструмент "Иерархия просмотра отладки" покажет, что Y-образ все еще находится за Z-представлением, внутри UITransitionView
. То есть, после трех шагов выше, иерархия представления:
- UIWindow
- UITransitionView
- UIView (просмотр Y)
- UIView (просмотр Z)
- UITransitionView
Я подозреваю, что это проблема, потому что во время перехода представление X фактически не является частью иерархии представлений.
Если я отправлю dismissViewControllerAnimated:NO
в X непосредственно перед transitionWithView:
, результирующая иерархия представлений:
- UIWindow
- UIView (представление X)
- UIView (просмотр Z)
Если я отправлю dismissViewControllerAnimated:
(YES или NO) в X, выполните переход в блоке completion:
, тогда иерархия представлений верна. К сожалению, это мешает анимации. Если оживлять увольнение, он тратит время; если он не оживляет, он выглядит сломанным.
Я пытаюсь использовать другие подходы (например, создание нового класса контроллера класса просмотра в качестве моего контроллера корневого представления), но ничего не нашел. Я обновлю этот вопрос, когда пойду.
Конечной целью является переход от представленного представления к новому контроллеру корневого представления напрямую и без оставления иерархии бездействия.