開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

presentPopoverFromBarButtonItemでwhich is already presentingエラー

 iOS8、相変わらずちょくちょく仕様変更がされていますね。
 ふと昔のアプリを使ってみると微妙に動かない場所が見つかったりします。

 今回のアップデートで、UINavigationBarItemから出していたUIPopoverControllerが表示されないようになってしまいました。

// before
UIImagePickerController* picker = [[[UIImagePickerController alloc] init] autorelease] ;
UIPopoverController* popImagePicker = [[[UIPopoverController alloc] initWithContentViewController:picker] autorelease] ;
UIBarButtonItem* item = [self.navigationItem rightBarButtonItem] ;
[popImagePicker presentPopoverFromBarButtonItem:item permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES] ;

 こんな感じのエラーが返ってくる

Warning: Attempt to present <UIImagePickerController: 0x7d85a000>  on <UINavigationController: 0x7b064200> which is already presenting <UIAlertController: 0x7bcb5500>

 ios - Warning: Attempt to present ModalTableViewController on MainTableViewController which is already presenting (null) - Stack Overflow
 ↑を参考にしたところ、よくわからないけどしばらく後に実行すれば良いらしい。

// after
UIImagePickerController* picker = [[[UIImagePickerController alloc] init] autorelease] ;
UIPopoverController* popImagePicker = [[[UIPopoverController alloc] initWithContentViewController:picker] autorelease] ;

dispatch_async(dispatch_get_main_queue(), ^ {
    UIBarButtonItem* item = [self.navigationItem rightBarButtonItem] ;
    [popImagePicker presentPopoverFromBarButtonItem:item permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES] ;
});

 View周りの超微妙な仕様変更はなぜ行われるのだろうか・・・
 更新されない昔のアプリを動かないようにして、最新のアプリを使わせるためなのだろうか・・・