はじめに
こんにちは。久しぶりにSwiftネタです。
今とあるアプリを開発しているのですが、UIActivityViewControllerを開いた状態で、メインのViewControllerの描画更新を行うと、動作がカクカクしてしまう問題がありました。解決方法は多分色々あると思うのですが、問題の切り離しも兼ねて、とりあえずUIActivityViewControllerを開いているときは画面更新を行わないような仕様にしようと思いました。
これを実装するために色々調べました。
試したこと
まず試したのは、completionWithItemsHandler
を使うという方法。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9U3dpZnQlMjAtJTIwVUlBY3Rpdml0eVZpZXdDb250cm9sbGVyJUUzJTgxJUE3JUU3JTg5JUI5JUU1JUFFJTlBJUUzJTgxJUFFJUU2JTk2JUI5JUU2JUIzJTk1JUUzJTgxJUE3JUUzJTgyJUI3JUUzJTgyJUE3JUUzJTgyJUEyJUUzJTgxJTk1JUUzJTgyJThDJUUzJTgxJTlGJUUzJTgxJUFFJUUzJTgyJTkyJUU1JTg4JUE0JUU1JUFFJTlBJUUzJTgxJTk5JUUzJTgyJThCJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1jOGQwYzJhNTNlODAxMzg2YmJiMWQ3Yzg0YWY0OWJiNA&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwdGV0c3VoYW1hJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1kMzFmNmVlMmFiZDYzYjRhYTIzMGMzZWM2YjA4ZTk0Ng&blend-x=142&blend-y=491&blend-mode=normal&s=9adc054e5f3b3b47e8848a9912212806)
確かに、正常に共有を行った時には、うまく判定に使えました。ただ、ユーザーが例えば右上の×とかでUIActivityViewControllerを閉じた時には、当然共有は行われていないわけですから、completionWithItemsHandler
は呼ばれないようで、なんだかなあと思いました。
解決策
これといったメソッドがあるというわけでもなさそうなので(実はあるのかもしれませんが)、道理に従うことにしました。
結論から言うと、UIActivityViewControllerを継承する形で新たにカスタムクラスを作って、そこのviewWillDisappear
をoverride
して、親の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等を用いるといいのではないかと思います。
参考になれば幸いです。