【Swift】UIActivityViewControllerが閉じたことを判定する方法

Swift

はじめに

こんにちは。久しぶりにSwiftネタです。

今とあるアプリを開発しているのですが、UIActivityViewControllerを開いた状態で、メインのViewControllerの描画更新を行うと、動作がカクカクしてしまう問題がありました。解決方法は多分色々あると思うのですが、問題の切り離しも兼ねて、とりあえずUIActivityViewControllerを開いているときは画面更新を行わないような仕様にしようと思いました。

これを実装するために色々調べました。

試したこと

まず試したのは、completionWithItemsHandler を使うという方法。

Swift - UIActivityViewControllerで特定の方法でシェアされたのを判定する - Qiita
シンプル家計簿 - Moneybook で、特定の方法でシェアしてくれた時にだけなにかしてあげるというのをUIActivityViewControllerを使って実装してました。ブレークポイントを…

確かに、正常に共有を行った時には、うまく判定に使えました。ただ、ユーザーが例えば右上の×とかでUIActivityViewControllerを閉じた時には、当然共有は行われていないわけですから、completionWithItemsHandlerは呼ばれないようで、なんだかなあと思いました。

解決策

これといったメソッドがあるというわけでもなさそうなので(実はあるのかもしれませんが)、道理に従うことにしました。

結論から言うと、UIActivityViewControllerを継承する形で新たにカスタムクラスを作って、そこのviewWillDisappearoverrideして、親のViewControllerの変数を変えることで、反映することとしました。

UIActivityViewControllerもViewControllerを継承しているはずで、蓋を開けてみればそりゃこの方法でできるよなと言う感じです。コードを載せておきます。

import UIKit

class ViewController: UIViewController {
  public var isSharing: Bool = false
  ...中略...
  
  func showActivityVC(){//AcitivityViewControllerを開くための関数
    self.sharing = true
    let shareFile = NSURL(fileURLWithPath: "YOUR FILE PATH")
    let activityItems = [shareFile]
    let activityVC = MYUIActivityVC(activityItems: activityItems, applicationActivities: nil)
    self.present(activityVC, animated: true, completion: nil)
  }
}

//UIActivityViewControllerを継承するカスタムクラスを作る
class MYUIActivityVC: UIActivityViewController {
    override func viewWillDisappear(_ animated: Bool) {
        let parentVC = self.presentingViewController as! ViewController
        parentVC.isSharing = false
    }
}

イメージとして、今回は、毎秒ごとに描画更新を行う関数があり、その関数内で、isSharingを用いることで、状態の判定を行って、描画するしないを分岐させる形になっています。

もし、閉じたことをトリガーにして何か処理をしたい場合は、こちら等を参考にプロパティ監視をするか、RxSwift等を用いるといいのではないかと思います。

参考になれば幸いです。

タイトルとURLをコピーしました