#SwiftでUIImagePickerControllerを使ってみた
SwiftでUIKit使ってみようということで定番のカメラアプリをUIImagePickerControllerを使って作ってみました。サンプルのソースをgithubにあげました。SwiftCam
基本的にはObjective-Cで書く方法と同じなのですが、微妙に引数や型が違かったりしたので、そこはUIImagePickerControllerの元ファイルをたどって見てもらえばObjective-Cではこういう名前のメソッドだったけどSwiftではこう書いてねっていうのが英語で書いてあります。
#使ってみて気付いたこと
##カメラ起動のタイミング
Objective-Cの時と同様、imagePickerはviewDidAppearのタイミングでカメラを起動してやります。
viewDidLoadの中でself.presentViewController(imagePicker, animated: true, completion: nil)でカメラを起動しようとすると whose view is not in the window hierarchy! というエラーで怒られます。
調べたところ、このエラーはiOSのライフサイクルイベントが絡んでいる様です。自分もこれから調べたものを詳しく詳しく読んでみます。
とりあえずはviewDidAppearで起動してやればオーケー。
##Selectorの指定の仕方
UIImageWriteToSavedPhotosAlbumメソッドのcompletionメソッドとしてimageDidFinishSavingWithErrorContextInfoメソッドを独自に用意して書きました。
その時UIImageWriteToSavedPhotosAlbumの中でSelectorの指定の仕方ってSwiftだとどうするんだろうと詰まりました。
結局のところソースの通りObjective-Cの時とそんな変わらず、複数の引数があったとしても
"関数名:仮引数:仮引数:"
のように書いて出来ました。
あとはNSErrorで書いていたところをNSErrorPointerで書けっていうのもほうほう、というところ。
#その他気をつけたいこと
##関数の中で関数を書いてもエラーが出ない
Objective-Cだと関数の中で関数を宣言して書くとかそもそも有り得なかったし気にもしていなかったところなんですが、Swiftだとそれが可能です。可能であるがゆえに気付かないでviewDidAppearの中でデリゲートメソッドを書いて「あれ、なんでここ通ってないの?」ってことになりました。
気をつけましょう。
#追記2014.11.07
久々にUIImagePickerControllerを使おうとしたところ、
Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.
というエラーが出てきました。
調べているとiOS7に移行した際にも出たエラーのようで、iOSのバグのようです。
エラー文から察するに「ViewControllerのViewのロード前にModalでUIImagePickerControllerを呼び出そうとしている」ということだと思い、NSTimerでUIImagePickerControllerを遅延呼び出ししてみましたがそれでもエラーは出ました。
引き続き回避策を探していきます。