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