【Xcode/Swift】iPadだと、UIActivityViewControllerがクラッシュする件について

UIActivityViewControllerとは、左の画像のようなUIのことを指します。

ここから色々と他のアプリなどで共有できるという機能です。

ただ、iPadで実行するとエラーが起きてしまいます。この記事ではその対応方法を紹介します。

UIActivityViewControllerの実装方法

let shareText = "Test"
let shareUrl = NSURL(string: "https://ios-docs.dev/")!
let activityVC = UIActivityViewController(activityItems: [shareText, shareUrl], applicationActivities: nil)
self.present(activityVC, animated: true)

基本的には上記のように記述します。

が、これだとiPadで実行すると、クラッシュしてしまいます。

以下のようなエラーが出ます。

Thread 1: “UIPopoverPresentationController () should have a non-nil sourceView or barButtonItem set before the presentation occurs.”

iPadでの対応方法

iPadでの対応方法は主に2つあります。

①iPad表示を無効化する。

iPadのチェックを外してください。

以下のような表示にはなりますが、クラッシュは起きなくなります。

②コードで対応する

以下のように修正する。

let shareText = "Test"
let shareUrl = NSURL(string: "https://ios-docs.dev/")!
let activityVC = UIActivityViewController(activityItems: [shareText, shareUrl], applicationActivities: nil)
if let popoverController = activityVC.popoverPresentationController {
    popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0)
    popoverController.sourceView = self.view
    popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
}
self.present(activityVC, animated: true)

CGRectrawValueの値を変更すると、表示する位置を変更することができる。

上記のコードだと画像のような位置に表示される

これでiPadでクラッシュせずにUIActivityViewControllerを呼ぶことができました。