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