この投稿はWatchKit Advent Calendar 2014の4日目の記事です。

Apple WatchでのPush画面遷移

Apple Watchでは以下の3種類の画面遷移があるようです。

  • push
  • modal
  • page (正式名称はわかりませんがページをめくるような遷移)

今回はpushのお話です。

リファレンス

今回もリファレンスを確認してWKInterfaceControllerに怪しいAPIがありました。

WKInterfaceController

WKInterfaceController Class Reference

以下の3つのAPIが関係ありそうです。
* pushControllerWithName:context:
* popController
* popToRootController

実装

Storyboard

以下のようにします。
storyboard

緑の四角形はボタンです。

コード

FirstInterfaceController.swift

// pushSecondボタン押下時の処理
@IBAction func onPushSecondButtonPushed() {
    pushControllerWithName("secondInterfaceControllerId", context: "gotoSecond!!")
}

引数nameには遷移先のInterfaceControllerのIdentifierを指定します。
IdentifierはStoryboardで設定します。
contextには遷移先のInterfaceControllerに受渡したい値を指定します。
contextはAnyObject!なのでなんでも受け渡せそうです。
contextはnilを指定することもできますが、おすすめはしません。(…とリファレンスに書いてありますが理由はよくわかりません。)

WatchKitにはiOSでいうNavigationControllerのようなものはありません。
pushControllerWithName:context:を実行するだけでpush画面遷移できます。iOSに慣れているとなんだか不思議。

SecondInterfaceController.swift

import WatchKit
import Foundation

class SecondInterfaceController: WKInterfaceController {
    
    // 初期化処理
    override init(context: AnyObject?) {
        super.init(context: context)
        NSLog("%@ init context:%@", self, context as String)
    }
    
    // pushThirdボタン押下時の処理
    @IBAction func onPushThirdButtonPushed() {
        pushControllerWithName("thirdInterfaceControllerId", context: "gotoThird!!")
    }
    
    // popボタン押下時の処理
    @IBAction func onPopButtonPushed() {
        popController()
    }
}

init実行のタイミング、つまりFirstInterfaceControllerのpushSecondボタン押下時に以下の様なログが表示されます。

2014-12-03 23:52:43.805 WatchKitSample WatchKit Extension[12014:2877844] <WatchKitSample_WatchKit_Extension.SecondInterfaceController: 0x7fe99c200080> init context:gotoSecond!!

contextで値を受け渡せていることがわかりますね。

popController()を実行すると前の画面に戻ることができます。
ただ、popで画面遷移すると、iOSのNavigationControllerのように自動的に左上に戻るボタンが表示されます。
戻るボタンは自分で実装する必要はなさそうです。

ThirdInterfaceController.swift

import WatchKit
import Foundation

class ThirdInterfaceController: WKInterfaceController {
    
    override init(context: AnyObject?) {
        super.init(context: context)
        NSLog("%@ init context:%@", self, context as String)
    }
    
    @IBAction func onPopButtonPushed() {
        popController()
    }
    
    @IBAction func onPopToRootButtonPushed() {
        popToRootController()
    }
}

popToRootController()を実行すると、FirstInterfaceControllerに戻れます。
一気に戻れるので便利ですね。

まとめ

以上、push画面遷移の解説でした。とっても普通。

宣伝

Swiftでカスタムキーボードアプリ作りました。買ってね!
特殊文字キーボード

[`evernote` not found]
Pocket