webViewDidFinishLoadまでviewWillAppearを延期
質問
私はいくつかのビューコントローラでUIWebViews
を使用するアプリケーションを持っています。 UIWebViews
は何の低速なネットワークアクセスを必要としない、ローカルで生成されたHTMLをレンダリングするために使用されます。
のViewController viewWillAppear
コールバックによって促さとして、私は唯一のオンデマンドでこれらを読み込むメモリを節約するために。 (とメッセージをdidReceiveMemoryWarning
に応じてオフスクリーンのインスタンスをアンロードします。)
問題は、ユーザーが時々スタイリングやその他の各種不快なアーティファクトの点滅を伴って、HTMLがレンダリングされている見ることを得ることです。私はむしろレンダリングがオフスクリーン行われ、完全にレンダリングされたビューを明らかにすることだろうというときにその準備ができています。
のUIWebViewが完全にレンダリングされるまで戻りませviewWillAppear
を持つことができるのは非常に整頓だろう。しかし、どのように?
私はそれをUIWebView
メッセージを送信することにより、レンダリングする何loadHTMLString:baseURL:
を教えてください。これは非同期であり、そしていくつかの時間は、(すぐに)、後のWebViewのデリゲートはwebViewDidFinishLoad
バック呼び出されます。
私は、viewWillAppear
内部実行ループを実行しているNSDefaultRunLoopMode
かUITrackingRunLoopMode
のいずれかを実行して実験を行いました。これは、シミュレータで動作します(それがログに文句
[CATransactionの同期]トランザクション内で呼び出されます。
が、仕事をして)それが呼び出されることはありませんされます。
webViewDidFinishLoad
と、デッドロックデバイス上
は、(また、それはプロパティが動作しませんUIWebView
ロードのように思える。私はloadHTMLString:baseURL:
と、それは真実ではないコールバックを取得する前に呼び出す。少なくとも、後に。)
正しい解決策はありません
他のヒント
ソリューションの多くは、ここで私は思います。迅速な1はYESに設定され、それが非表示のプロパティを使用してのUIWebViewをロードすることです。そして、UIWebViewsデリゲートとしてあなたのUIViewControllerを設定し、実装します:
- (void)webViewDidFinishLoad:(UIWebView *)webView
あなたがNOに戻ってプロパティを設定するところます。
注意すべき事は、あなたが囲まれている場合は/埋め込まれたコンテンツをwebViewDidFinishLoadが複数回発生しますということです。だから、これを追跡する必要があります。あなたがローカルコンテンツをロードしている場合、実際に問題になることはありません。
私は最善のmonowerkerのソリューションを好きですが、別の解決策は、(ビューコントローラよりも、いくつかのより恒久的なオブジェクトで)すでにレンダリングのUIWebViewの上のすべての時間を保持することです。 monowerkerのソリューションの表情があまりにも破壊的である場合、私はそれを行うと思います。