Изменить представление перед применениемWillEnterForeground

Я хочу заблокировать пользователей от моего приложения после периода нахождения в фоновом режиме. Я ловлю это в AppDelegate applicationWillEnterForeground (и сравниваю со временем, хранящимся в applicationWillResignActive). Если время меньше тайм-аута, никаких действий не происходит. Если больше, чем период ожидания, я звоню:

[_navigationController popToRootViewControllerAnimated:NO];

который возвращает пользователя к корневому представлению.

Он отлично работает с одним визуальным прерыванием. Предыдущее представление (то, которое просматривал пользователь, когда приложение стало неактивным) появляется очень ненадолго, прежде чем перейти к корневому каталогу. При тестировании кажется, что представление снова появляется до вызова applicationWillEnterForeground.

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

Я также открыт для различных способов достижения одного и того же конечного результата. Спасибо!


person Mitch Cohen    schedule 23.05.2011    source источник
comment
Откуда именно вы вызываете метод popToRootViewController?   -  person TheBlack    schedule 24.05.2011
comment
@TheBlack: я вызываю [_navigationController popToRootViewControllerAnimated:NO] в методе applicationWillEnterForeground делегата приложения.   -  person Mitch Cohen    schedule 24.05.2011
comment
Если бы вы добавили контроллеры представления в applicationWillResignActive, ваша проблема была бы решена, но это не вписывается в вашу концепцию. В любом случае, добавление VC в applicationWillResignActive — правильное место для этого. Мое решение состояло в том, чтобы всегда открывать VC и восстанавливать их, если пользователь возвращался в приложение через какой-то промежуток времени.   -  person TheBlack    schedule 24.05.2011
comment
Я решил это, сделав вид невидимым. В applicationWillResignActive у меня есть _navigationController.view.alpha=0;, и я поместил _navigationController.view.alpha=100; в applicationWillEnterForeground после (при необходимости) появления окна входа в систему. Проще, чем извлекать и восстанавливать представления (которые в данном случае довольно тяжелы). Я оставлю это открытым на время, если у кого-то есть решение поставленного вопроса.   -  person Mitch Cohen    schedule 25.05.2011
comment
То, что вы придумали, является вполне допустимым решением. Кроме того, у UIViews есть свойство с именем «скрытый», вы также можете его использовать :)   -  person TheBlack    schedule 25.05.2011


Ответы (2)


Я решил это, сделав вид невидимым. В applicationWillResignActive у меня есть _navigationController.view.alpha=0;, и я разместил _navigationController.view.alpha=100; в applicationWillEnterForeground после (при необходимости) перехода к представлению входа в систему. Проще, чем извлекать и восстанавливать представления (которые в данном случае довольно тяжелы).

@TheBlack указывает на скрытое свойство, которое, вероятно, немного проще на устройстве. Я оставляю альфа-версию, потому что а) отладка с 50% альфа-просмотром доставляет удовольствие, и б) мне просто нравится альфа-версия. Но если вы не фанат альфы, как я, спрятанный может быть немного лучше.

person Mitch Cohen    schedule 06.06.2011

Из документации: Стратегии обработки переходов состояния приложения

Подготовьтесь к моментальному снимку приложения

Вскоре после возврата метода applicationDidEnterBackground: делегата приложения система делает снимок окон приложения. Точно так же, когда приложение пробуждается для выполнения фоновых задач, система может сделать новый снимок, чтобы отразить любые соответствующие изменения. Например, когда приложение пробуждается для обработки загруженных элементов, система делает новый снимок, чтобы отразить любые изменения, вызванные включением элементов. Система использует эти моментальные снимки в многозадачном пользовательском интерфейсе, чтобы показать состояние вашего приложения.

Если вы вносите изменения в свои представления при входе в фоновый режим, вы можете вызвать snapshotViewAfterScreenUpdates: метод вашего основного представления, чтобы принудительно отобразить эти изменения. Вызов метода setNeedsDisplay для представления неэффективен для моментальных снимков, поскольку снимок делается до следующего цикла рисования, что предотвращает отрисовку любых изменений. Вызов метода snapshotViewAfterScreenUpdates: со значением YES приводит к немедленному обновлению базовых буферов, используемых механизмом моментальных снимков.

person trapper    schedule 28.06.2014