2015-05-02 2 views
0

У меня есть взгляд на Watchkit, который я обновляю с помощью MMWormwhole, использующего уведомления Darwin. Все работает хорошо, пока Glance «включен», я имею в виду активный/показанный - до того, как Apple Watch «отключит его» из-за экономии энергии, чтобы экран Watch был черным/выключен (надеюсь, вы меня получите); ...WatchKit Взгляд на вызов Lifecycle, когда он возвращается с энергосбережения?

При нажатии короновать Glance вернулись показ, но если что-то изменилось, пока он был «выключен», он не получает уведомление больше и поэтому Ждет т обновления ...

Так есть ли какой-либо вызов жизненного цикла, который просматривается перед тем, как «просыпаться от энергосберегающего режима», чтобы я мог снова обновить интерфейс? Что-то вроде «назад из фонового режима». Я знаю, что нет никакого фона для просмотра ... Я ничего не мог найти ...

Любое обходное решение или что-то, что я мог сделать?

Спасибо!

+1

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

+0

ye thx, это работает, хотя awakeWithContext прозвучал как хорошее место, но это не ... – Kreuzberg

ответ

0

для жизненного цикла, вы можете проверить this blog

При наличии нескольких страниц на основе контроллера интерфейса загружаются (являются ли они корневые интерфейсы или они были представлены модально), INIT и awakeWithContext: называются на всех контроллерах, прежде чем willActivate вызывается на первой странице. Это означает, что вы можете улучшить кажущуюся отзывчивость своего приложения, выполняя как можно меньше работы в этих двух методах. Поскольку это общий вопрос, имейте в виду, что awakeWithContext: больше не будет вызываться.

Хотя нет никаких жестких правил о работе, которую вы должны выполнить в init vs. awakeWithContext :, awakeWithContext: это самый ранний, который у вас есть доступ к контексту. Из-за этого вы можете решить выполнить общую инициализацию в init и более контекстно-зависимую работу в awakeWithContext :. Обратите внимание, что вы можете настроить элементы интерфейса в обоих этих методах.

После того, как контроллер интерфейса инициализирован и передал его контекст, единственным моментом, когда он может обновить свой интерфейс, является активный интерфейс. Это означает, что вы можете выполнять обновления в willActivate (когда интерфейс становится активным) и в любой момент до тех пор, пока не будет вызвана функция didDeactivate. Однако вы не можете обновить интерфейс внутри didDeactivate, так как интерфейс больше не считается активным.

На следующей диаграмме показаны два интерфейсных контроллера на основе страниц, работающих на реальном оборудовании Apple Watch. Я упоминаю об этом, потому что уведомления NSExtensionContext, которые вы видите здесь, не поставляются в симуляторе.

enter image description here

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

Далее вы видите два уведомления NSExtensionContext,> NSExtensionHostWillEnterForegroundNotification и> NSExtensionHostDidBecomeActiveNotification. Обычно эти два уведомления являются очень надежными. Тем не менее, в моем тестировании я заметил, что даже если вы зарегистрируетесь в качестве наблюдателя в методе инициализации вашего контроллера интерфейса, вы можете не поймать эти первые два уведомления. Итак, вам нужно планировать соответственно.

Далее я проведите пальцем по странице 2. Обратите внимание, что willActivate вызывается на втором интерфейсном контроллере, прежде чем didDeactivate вызывается в первом.Это противоречит следующему утверждению в Руководстве по программированию Apple Watch:

Во время перехода вызывается метод didDeactivate в настоящее время видимого интерфейса контроллера, за которым следует вызов метода willActivate контроллера интерфейса, который должен быть отображен ,

Этот фрагмент документации кажется неправильным или устаревшим, основываясь на моем опыте как с симулятором, так и с фактическим оборудованием.

Замечание: Эта же последовательность возникает при представлении модального интерфейса. То есть, willActivate вызывается на представленном контроллере, за которым следует вызов didDeactivate на представляющем контроллере. Когда модальный интерфейс уволен, снова будет вызываться активацияActivate на контроллере представления, а затем вызов didDeactivate на представленном (теперь уволенном) контроллере. Наконец, как и следовало ожидать, если нет более сильной ссылки на теперь отключенный контроллер, он освобождается (от другого потока, между прочим).

Назад к нашему двухстраничному примеру. Если я опустил руку, вы увидите, что доставляются два уведомления: NSExtensionHostWillResignActiveNotification и NSExtensionHostDidEnterBackgroundNotification. Наконец, didDeactivate вызывается на втором интерфейсном контроллере до того, как приложение приостановлено (Watch оставляет за собой право прекратить действие вашего приложения).

Ожидая несколько секунд, я поднимаю руку, чтобы разбудить приложение, и вы можете увидеть два уведомления NSExtensionContext до того, как willActivate вызывается на нашем втором интерфейсном контроллере. Этот шаблон продолжается, когда контроллеры выталкиваются, выскакиваются, отображаются и увольняются.

Жизненный цикл, который мы рассмотрели здесь, является тем же самым для иерархических интерфейсов, интерфейсов Glances и Notification, поэтому вы можете использовать эти события во всех этих ситуациях.

Смежные вопросы