« 世代交代 | トップページ | 冥利に尽きます »

watchOS2にNSTimerの待ち時間を挿入する

Watch01 この週末は、いつもの「積もれば山となる」仕事がなかったので、一週間ほど止まったままだったAppleWatchのバグ潰しにかかっていました。
 
 簡単に説明すると、アニメーションの再生が終了するまで、次のステップに進まないようにプログラム進行に待ち時間を挿入することでした。
 そのアニメーションは、iOS/watchOSでは定番の連番PNGをパラパラアニメ状態で表示するもの。 これ自体は、コツさえ分かれば簡単なんだけど、これをバックグラウンドで再生するために、そして何より再生状態を返すような関数もないために、再生終了後に画面遷移させるつもりで命令を入れると、再生開始後一瞬で画面が切り替わってしまいました。
 
 う〜ん、ここはpauseとかstopとか無いのかね、と調べて、sleepとか見つけたんですが、これらは全体に作用するので、アニメーションも同時に止めてしまい、設定時間が過ぎたら何もなかったかのように画面推移してしまうことがわかりました。
 この時点で、NSTimerというクラスの存在には気づいていて、最後にこれを試すんだけど、NSという名前が予感させる通り、直感的に分かりにくい上に動かない。

 いろいろ検索すると、こういう例が複数上がってきました。(これらの内容を批判する気はありません。私の無知の所以です)

var timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "meirei", userInfo: nil, repeats: false)
func meirei(){
print("命令を実行")
}

 
 これを編集し、ビルド成功後に実際に走らせると例の「signal SIGABRT」という、低次元だけど、ある意味対策に苦労するメッセージととともに止まってしまいました。
 さらにログをよく読むと、「unrecognized selector sent to instance」という解説が出ています。 つまり、設定したセレクターとインスタンスが繋がっておらず、呼び出された時点でクラッシュするわけです。
 と、書くと簡単ですが、実は単純トラブルだろうと思い込んでいたために、これがわかったのはここの回答文の末尾をやっと探し当てた時。 いや、このそのものズバリの記事がなかなかgoogle検索で出てこなかった苦労...

 加えて、すでに三回くらい読みなおした高橋氏の「絶対に挫折しない iPhoneアプリ開発「超」入門」でインスタンスなどを復習。
 対策として、NSTimer.scheduledTimer... 自体、既に Foundationフレームワークでpublic class func として宣言されているので、まず頭の「var timer = 」を削除。
 これでも動かないので、「func meirei(){...}」をもっと上流に書き直し、といっても、iOSアプリで最上流の「class ViewController: UIViewController {」文が無いので、「class InterfaceController: WKInterfaceController {」以下に移動。
 すると見事成功しました。 拍手!
 
 いつもながら、こうして整理後に備忘として載せるときにはあっさりしているものの、実は二日間の貴重な空き時間と睡眠時間をこれで浪費。 これまた、もうこれを越えられないかも。 やっぱこの歳で新しい言語は無理かも、と諦めが頭をかすめつつの中からの脱出でございました。
 しぶとい...

|

« 世代交代 | トップページ | 冥利に尽きます »

iOS と Xcode」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 世代交代 | トップページ | 冥利に尽きます »