WKInterfaceControllerの生成など

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