[iOS] UIDocumentInteractionControllerで"Could not instantiate class NSURL."とか言われたしまった時

iOSの環境でUIDocumentInteractionControllerでファイルをシェアしようとした時にシェア用の画面は出るけど、その後エラーになってしまい保存できない問題がありました。 ```text `gutter:false; Could not instantiate class NSURL. Error: Error Domain=NSCocoaErrorDomain Code=4864 "The URL archive of type “public.url” contains invalid data." UserInfo={NSDebugDescription=The URL archive of type “public.url” contains invalid data.} ``` 上記のエラーがでた原因がよく分からなくて悩んだので解決先です。 ## 解決策 - UIDocumentInteractionControllerのインスタンスはクラス変数で保持しておく 上記の事をしていないと、作成したUIDocumentInteractionControllerのインスタンスが開放されるのかうまく動作しません。 Googleで検索したサンプルコードをそのまま使うと、上記のパターンになっていてNGになる事があるので注意してください。 ```objc `gutter:true; class ViewController: UIViewController { var controller: UIDocumentInteractionController? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func onTapButton(_ sender: UIButton) { showShareView(sender) } func showShareView(_ sender: UIView) { guard let image = UIImage(named: "start") else { print("画像ファイルを読み込めません") return } let data = image.pngData() // ファイル一時保存してNSURLを取得 guard let url = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("tmp.png") else { print("URLを作成できません") return } try! data?.write(to: url, options: .atomic) // UIDocumentInteractionControllerはクラスインスタンスで保持しておく controller = UIDocumentInteractionController(url: url) if !(controller!.presentOpenInMenu(from: sender.frame, in: view, animated: true)) { print("ファイルに対応するアプリがありません") } } } ``` ## 参考URL - [アプリ間のファイル連携について](https://dev.classmethod.jp/articles/ui_documentinteraction_controller/) - [サンプルコード](https://github.com/k28/ios-sample/tree/master/UIDocumentInteractionController-sample)

0 件のコメント :

コメントを投稿