私は単純なSwiftプロジェクトを持っています:
ViewController A ( class ViewController: UIViewController
) はViewController B -- ( class WebViewController: UIViewController, WKNavigationDelegate, CLLocationManagerDelegate, WKScriptMessageHandler
) を表します。
ViewController B は本質的に単なる WKWebView ですviewDidLoad()
。
let contentController = WKUserContentController();
contentController.addScriptMessageHandler(
self,
name: "eventHandler"
)
let config = WKWebViewConfiguration()
config.userContentController = contentController
webView = WKWebView(frame: CGRectZero, configuration: config)
webView.navigationDelegate = self
webView.allowsBackForwardNavigationGestures = false
view = webView
したがって、ViewController B が表示されると、基本的に画面全体に Web ブラウザーが表示されます。
私が直面している問題は、ユーザーが (Web ページ上で) 「ファイルのアップロード/ファイル ピッカー」をクリックすると、最初に次のように表示されることです。
タイプ public.item で渡されたものは、public.content または public.data のいずれにも準拠していません。新しい型をエクスポートする場合は、適切な親型に準拠していることを確認してください。UICollectionViewFlowLayout の動作は定義されていません。アイテムの幅は、UICollectionView の幅から、セクション インセットの左右の値を差し引いた値、コンテンツ インセットの左右の値を差し引いた値よりも小さくなければならないためです。
関連する UICollectionViewFlowLayout インスタンスは <_UIAlertControllerCollectionViewFlowLayout: 0x12e30f270> であり、にアタッチされています。アニメーション = {bounds.origin=; 境界.サイズ=; 位置=; }; レイヤー = ; contentOffset: {0, 0}; contentSize: {0, 0}> コレクション ビュー レイアウト: <_UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>。
次に、ユーザーが iOS オプション リストから「写真またはビデオを撮る」または「フォト ライブラリ」を選択すると、次のようになります。
警告: UIImagePickerController: 0x12d192200 on My.WebViewController: 0x12e2883e0 ビューがウィンドウ階層にないことを提示しようとしています!
結果は次のとおりです。
- フォト ライブラリ ピッカー // カメラ アプリは表示されません。
- なんらかの理由で、ViewController B がアニメーションで閉じられます。
誰か提案はありますか?関連するコードを提供しようとしましたが、必要に応じてさらに貼り付けることができます。ありがとうございました。
- アップデート - - - -
さて、さらに調査した結果、実際には2つの別々のことが起こっています。
最初のエラーは、「ファイル ピッカー」がモバイル ブラウザによってどのように処理されるかの関数です。 ここを参照してください...物事の壮大な計画であり、大したことではありません。
2 番目のエラー
Attempt to present UIImagePickerController...
-- 2 つの中でより衰弱させる -- は、より醜いものです。
WKWebView を持つ ViewController が別のViewController から提示された場合、ユーザーが (ライブラリまたはカメラから) 画像を「選択」しようとすると、iOS は WKWebView ViewControllerからUIImagePicker を提示しようとします。
残念ながら、理由はまだわかりませんが、ユーザーが画像を「選択」しようとすると、iOS は提示されたビュー コントローラーを却下します。この場合、それはあなたの WKWebView コントローラーです :( 、WKWebView ViewControllerが消えるため、UIImagePickerを表示しようとするとウィンドウ階層にありません-したがって、エラーです。
私の解決策(かなりハックですが、私の特定のユースケースで機能します)は次のとおりです。これが誰かに役立つことを願っています:
- WKWebView ViewController ( ViewController B )をインスタンス化する
- VC Bをアプリのルート ビュー コントローラーとして設定する
- ViewController AからVC Bを提示する
- VC Aを却下する
これにより、本質的に WKWebView を閉じることができなくなり、問題を回避できます。
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("Browser") as! WebViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
self.presentViewController(vc, animated: false, completion: { () -> Void in
self.dismissViewControllerAnimated(false, completion: nil)
})