Представление в UITabBarController исчезает после предупреждения памяти - PullRequest
1 голос
/ 06 февраля 2012

У меня есть UINavigationController на одной из вкладок UITabBarController.

Теперь я представляю новый контроллер представления (назовем его Стив) для всего приложения (используя presentViewController:animated:completion:).

Затем я имитирую нехватку памяти.

После увольнения Стива (используя dismissViewControllerAnimated:completion:), я теперь вижу, что представление UINavigationController исчезло;на вкладке;видна только пустая белая область!

Почему это?Я пытался вызвать методы view на всех мыслимых контроллерах после увольнения Стива, но содержимое вкладки все еще остается пустым (белым).

Странная вещь заключается в следующем: Если ящелкните на другой вкладке и вернитесь на исходную вкладку, содержимое (контроллер навигации) снова будет отображаться нормально.Контроллер панели вкладок делает что-то особенное, чтобы заставить представление отображаться?


ОБНОВЛЕНИЕ: Мне удалось «исправить» мою проблему с этим ужасным кодом, незадолго до того, как Стив уволил:

[[[[[self tabBarController] view] subviews] objectAtIndex:0]
        addSubview:[[self navigationController] view]];

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

Это, конечно, ужасно, потому что оно делает внутренние предположения о структуре подпредставления представления контроллера панели вкладок.

Если у кого-то есть какие-либо более лучшие решения, пожалуйста, дайте мне знатьо них.

1 Ответ

0 голосов
/ 07 февраля 2012

Когда ваше приложение получает предупреждение о памяти, первое, что оно сделает, - отбросит иерархии представлений любых контроллеров представлений, которые имеют загруженные представления, но в данный момент не видимы (например, UINavigationController). Скорее всего, независимо от того, какой контроллер представления находится на вершине стека навигации, его представления отбрасываются, но не перезагружаются при повторном появлении.

Всегда указывайте код конструкции вашего представления в -loadView или -viewDidLoad, а не в -init. Таким образом, контроллер представления восстановит ваше представление, если оно было отброшено из-за предупреждения памяти.

(P.S .: Причиной того, что ваш хак работает, является бит, в котором вы вызываете [[self navigationController] view], который, в свою очередь, вызывает -loadView на верхнем VC в стеке, заставляя его восстановить свое представление.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...