これは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で行います。