UIWebView で input[type=file] が正常に動かない対応について -決定版-

基本的なことは「iOSアプリのwebviewでinput[type=file]が正常に動作しない時」見てもらえれば分かるかなと思います。

簡単に説明すると画像を選択後 Image Picker を閉じようとした際に WebView をモーダルで表示していた場合、モーダルごと閉じられてしまうということです。

どういう view 構造にするかにもよりますがこのような構造でモーダルを表示していたとします。

[modal の view 構造]
UINavigationController
  └── UIViewController
      └── UIWebView

この場合 UINavigationController に対して解決方法を適応してやればいいわけです。

extension UINavigationController {

    override public func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
        if presentedViewController != nil {
            super.dismissViewControllerAnimated(flag, completion: completion)
        }
    }
    
}

ただしこれだと問題があります。

それは UIActivityViewController を使って新たに ActivityItem を追加しようとした時です。 追加しようとしたモーダルが閉じれなくなってしまうんですね。。。

f:id:dealforest:20160330013354p:plain

というわけで、その状況にも対応しようとするとこのようになります

extension UINavigationController {

    override public func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
        if presentedViewController != nil || presentingViewController is UIActivityViewController {
            super.dismissViewControllerAnimated(flag, completion: completion)
        }
    }
    
}

HTML の方が楽な場合(複雑な投稿画面等)とかもあるのでそういう時では使っていきたいんですが、なかなか一筋縄ではいきませんね。 WKWebView では同じ現象が起きるかどうかは知りませんが起きないことを祈ります。