In an effort to reduce loading times for 3rd party watch apps, for a page-based interface, Apple has changed the calling pattern for willActivate() and didDeactivate() . In essence, WatchOS will more aggressively call willActivate() on your WKInterfaceController even if it is not visible to cache the view so it can be displayed immediately when you swipe over to it.

While this is effective in reducing loading spinners that users will see, it can cause bugs based on some common assumptions that developers might make.

Let's first take a moment to understand deeply the change in the calling pattern.

In WatchOS 1.0, Apple would call willActivate() only just before the page is visible, and didActivate() only just as the page is losing visibility. This pattern could occur if the watch is going to sleep, or transitions between interface controllers.

Here's a trace of a page-based interface with 5 interface controllers.

WatchOS 1.0 Life Cycle