
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)
CGRectやrawValueの値を変更すると、表示する位置を変更することができる。

上記のコードだと画像のような位置に表示される
これでiPadでクラッシュせずにUIActivityViewControllerを呼ぶことができました。
参考文献

