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
を呼ぶことができました。
参考文献