Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

UIDocumentInteractionControllerでクラッシュ

Swiftが熱いですね!
Objective-Cなんてもう忘れ去れるくらい最近Swiftしか書いてないです。
ということで、Swiftを使ってちょっとハマった事をメモ。

外部アプリにファイル転送

外部アプリにファイルを転送するときに便利なものに、UIDocumentInteractionControllerがあります。よく見る、Open In...ってやつですね。これを普通に使うと

    @IBAction func showOpenIn(sender: AnyObject) {
        if let url = NSBundle.mainBundle().URLForResource("pdf_name", withExtension: "pdf") {
            let dic = UIDocumentInteractionController(URL: url)
            dic.delegate = self
            dic.presentOpenInMenuFromBarButtonItem(openInButton, animated: true)
        }
    }

このようなコードになると思います。
しかし、このまま実行すると、iBooksを選択することまではできるのですが、選択した後落ちてしまいました。
ちなみに、シミュレーターだとUIDocumentInteractionControllerがうまく動かないため、実機で実行する必要があります。

こうすればOK

上記のコードで落ちてしまう原因は、関数が終了した段階でGCdicインスタンスを開放してしまうことが原因のようです。そのため、今回はクラスのインスタンス変数にインスタンスを保持する事で解決しました。コードにすると以下のようになります。

    var dic:UIDocumentInteractionController?
    @IBAction func showOpenIn(sender: AnyObject) {
        if let url = NSBundle.mainBundle().URLForResource("pdf_name", withExtension: "pdf") {
            dic = UIDocumentInteractionController(URL: url)
            dic?.delegate = self
            dic?.presentOpenInMenuFromBarButtonItem(openInButton, animated: true)
        }
    }