Edited at

UIImagePickerControllerをStoryBoardで表現することがiOS8で出来なくなった。

More than 3 years have passed since last update.


前置き

来週にはiOS9も来るというのに、いまさらながら気づいた問題があったので備忘録です。

間違った内容があったら、ご指摘してください。

iOS7まではStoryBoard上でUIImagePickerControllerを指定することが可能でした。

UIViewControllerを配置して、インスペクター上のCustom ClassでUIImagePickerControllerを指定することで簡単に遷移状態を表現することが可能でした。

UIImagePickerControllerはサブクラス作れないので、細かい設定は呼び出し元のprepareForSegueで指定する必要があったりはするんですが。

ところがiOS8からはUIImagePickerControllerはNSOperationQueue内でpresentViewController等コールする必要ができた。

しかし、通常のStoryBoardのsegueでは表示方法はStoryBoard任せになるので、NSOperationQueue内に記述することができない。

いろいろ検討してみる余地はあるんですが、一番コスト低いのは結局UIImagePickerControllerの呼び出しを無理にStoryBoardで表現せずにハードコーディングすることでした。


実装

- (void)doImagePickerController

{
UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.allowsEditing = NO;
imagePicker.delegate = self;

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self presentViewController:imagePicker animated:YES completion:nil];
}];
}

#pragma mark <UIImagePickerControllerDelegate>

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
[self dismissViewControllerAnimated:YES completion:nil];
//TODO:

}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[self dismissViewControllerAnimated:YES completion:nil];
}


検討

カスタムSegueを実装してみることも考えたんですが、ハードコーディングすれば上記のコード量で済むので、おそらくこれが最小コストだろうということで辞めました。


参考記事

http://iphone-app-developer.seesaa.net/article/405948027.html