これはWatchKit Advent Calendar 2014の21日目の記事です。
WKInterfaceControllerとは、Watch Kit で、一画面の描画を担当するコントロールクラスです。 iOSでいえばUIViewControllerにあたるクラスですね。
WKInterfaceController の初期化時の処理
WKInterfaceControllerの初期化時の処理はinitまたはawakeWithContextで行います。 この二つの関数は、init、awakeWithContextの順番でどんな生成ルートでも呼ばれます。
awakeWithContextで渡される引数 contextは、生成ルートによって異なるので、共通の処理をinitに記述し、状況によって違う処理をawakeWithContextに記述するのがいいでしょう。
- (instancetype)init { self = [super init]; if (self){ //共通の初期化処理 } return self; } - (void)awakeWithContext:(id)context { [super awakeWithContext:context]; // 状況によって違う初期化処理 NSLog(@"awakewithcontext"); }
(ちなみに、最新のXcodeでinitとawakeWithContextでNSLogをすると、なぜか最後の1文字と改行コードが出力されません。)
iOSでは、UIViewControllerの初期化時の処理としてviewに表示するボタンをつくって配置したりすることもありますが、Watch Kitでは、画面コントロールの増減をコード上で行うことはできません。
画面コントロールの表示・非表示を行うのであれば、動的に生成するのではなく、あらかじめ生成しておいたコントロールを setHiddenで隠したり表示したりして行いましょう。
WKInterfaceControllerの生成後の処理
さて、次は生成したあとに実際に表示・非表示された場合の処理です。 UIViewControllerのviewWillAppearなどと同じように、表示・非表示の際によばれるメソッド、willActivate、didDeactivateがあります。
willActivateは、画面が表示される直前によばれ、didDeactivateは画面が非表示になった直後によばれます。 willAtivate = UIViewController:viewWillAppear didDeactivate = UIViewController:viewDidDisappear ということですね。
- (void)willActivate { [super willActivate]; NSLog(@"willActivate"); } - (void)didDeactivate { [super didDeactivate]; NSLog(@"didDeactivate"); }
ここでも必要であれば画面コントロールの表示・非表示をsetHiddenで行います。