AppSeedのアプリ開発ブログ

アプリ開発会社AppSeed(アップシード)開発担当のブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsや備忘録、アプリ開発に役立つ情報を発信します。

iPadでUIAlertControllerStyleActionSheetを使う場合に注意すること【iOSアプリ開発】

https://i-cdn.phonearena.com/images/article/100355-image/Bizarre-chapter-in-Apple-iPhone-history-ends-with-iOS-11.2-update.jpg


iPadでUIAlertControllerStyleActionSheetを使う場合に注意すべきことに関するメモ。




iPadでUIAlertControllerStyleActionSheetを使おうとした際のエラー

iPadでUIAlertControllerStyleActionSheetを使って選択肢を表示しようとしたら、以下のようなエラーが表示されました。

Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController () of style UIAlertControllerStyleActionSheet from Nikky.ViewController (). The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'

iPadでUIAlertControllerStyleActionSheetを使う場合はpopoverPresentationControllerのsourceViewにself.viewを指定する

[Swift]iPadのActionSheet表示でクラッシュする問題 | RE:ENGINES

上記の記事が参考になりました。

こちらの記事によると、iPadで、UIAlertControllerStyleActionSheetを使う場合は、popoverPresentationControllerのsourceViewを指定しないとクラッシュしてしまうようです。

//iPadでUIAlertControllerStyleActionSheetを使う場合

let alert: UIAlertController = UIAlertController(title:"", message: "", preferredStyle:  UIAlertController.Style.actionSheet)
if UIDevice.current.userInterfaceIdiom == .pad{
            alert.popoverPresentationController?.sourceView = self.view
            let screenSize = UIScreen.main.bounds
            alert.popoverPresentationController?.sourceRect = CGRect(x: screenSize.size.width/2, y: screenSize.size.height, width: 0, height: 0)
}
        

上記のようにしたらiPadでもUIAlertControllerStyleActionSheetが使えました。
sourceRect を指定しているのは、指定しない場合、アクションシートが左上に表示されてしまうためです。