viewDidAppear больше не запускается после выхода приложения на передний план - PullRequest
9 голосов
/ 24 марта 2011

Я обнаружил проблему в коде приложения для iPhone, так как метод viewDidAppear не всегда срабатывает. Когда вы запускаете приложение, событие запускается, как и ожидалось. Однако, если я закрою приложение с помощью телефона, поддерживающего многозадачность, и снова открою его. Мои события viewDidAppear больше не запускаются.

Мои представления загружаются из Nibs, и я использую viewDidUnload, чтобы очистить (освободить и обнулить все выходы). Мои представления вложены в боковую панель и панель вкладок, затем контроллеры навигации. Похоже, что события не передаются должным образом, когда перья перезагружаются. Любая идея о том, что я делаю неправильно / отсутствует и как я могу это исправить?

Заранее спасибо.

ОБНОВЛЕНИЕ Я не имею в виду, что событие не запускается, когда приложение впервые выходит на передний план. Я имею в виду, что событие больше никогда не начнется. Даже при переходе между вкладками или перемещении по видам навигации.

Пример:

- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   NSLog(@"viewDidAppear called");
}

Этот код размещен в двух представлениях, каждое на разных вкладках. Каждый раз, когда я переключаюсь между вкладками, "viewDidAppear звонил" записывается в журнал. Когда я закрываю и снова открываю приложение и переключаюсь между вкладками, это больше не происходит. Другие события кнопок срабатывают нормально.

Ответы [ 2 ]

10 голосов
/ 24 марта 2011

Кстати, метод viewDidUnload действительно имеет неправильное название btw - он не является "противоположностью" viewDidLoad, он вызывается только в том случае, если была нехватка памяти и представление этого контроллера было выгружено из-за отсутствиявидимый в то времяПочему viewWillAppear не вызывается, когда приложение возвращается из фона?

По сути, viewDidAppear вызывается после того, как представление UIViewController было добавлено в иерархию UIWindow приложения.Фоновая обработка и восстановление приложения не изменяет ваш взгляд в этом отношении, поэтому viewDidAppear не вызывается - это правильное поведение, а не ошибка.Ознакомьтесь с документацией по API для UIViewController.

7 голосов
/ 24 марта 2011

Нашел это.

Хотя я не новичок в программировании, я новичок в разработке для iPhone. При исследовании этой проблемы я обнаружил, что не рекомендуется вызывать методы viewWillAppear и viewWillDisappear вручную.

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

Поскольку viewWillDisappear не вызывается, когда приложение переходит в фоновый режим, чтобы удостовериться, что на моем заставке не появилось никаких клавиатур, я звонил viewWillDisapper в методе applicationDidEnterBackground. Я думаю, это также отменяет регистрацию моих событий.

Добавив viewWillAppear к моему методу applicationDidEnterForeground, мои события снова начали срабатывать. Извлеченный урок, я проведу рефакторинг, чтобы не вызывать эти события вручную.

Спасибо за помощь.

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