2010-05-11 76 views
4

我正在加載一個比較大的(並且JavaScript重)的頁面到一個UIWebView中,並且我想在它想的時候添加一個UIActivityView來旋轉。UIWebView完成太快

問題是,我的- (void)webViewDidFinishLoad:(UIWebView *)webView方法在渲染實際發生之前被調用了很長時間。足夠讓我的微調器(它在停止時隱藏)永遠不會顯示出來。當UI被組裝時,即使在UIWebView實際將商品拿到屏幕上之前有足夠的時間來弄清楚它是否被破壞,微調框已經被停止和隱藏了。

我希望能有一個「webViewDidFinishRendering」,但是這將意味着,WebKit是比lickedy分裂快以外的東西... ;-)

的思考?也許我應該把事情搞定,並設置一個計時器來阻止它,並從WebView中實際發生的任何事情中解開它?

回答

4

這裏是我如何處理,我需要確保在頁面完全加載情況:添加一個JavaScript事件處理程序,做這樣的事情document.onload事件:

function onDocumentLoad() { 
    window.location.href = 'myapp://loaded'; 
} 

然後在你的UIWebViewDelegate,你可以這樣做:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    if ([[request.URL absoluteString] isEqual:@"myapp://loaded"]) { 
     [activityIndicator stopAnimating]; 
     return NO; 
    } 
    return YES; 
} 
+0

整潔!我會嘗試的! – 2010-05-13 00:53:36

+0

不幸的是,當webViewDidFinish ...方法執行時,這個問題被解僱了。然後幾秒鐘後WebView完成渲染地圖。 – 2010-05-13 17:35:12

+0

你說這個頁面是JavaScript重的。 DOM或頁面加載完成時運行的javascript是否會導致呈現延遲?如果是這樣,可能還有其他一些地方可以注入window.location.href賦值來在最後時刻停止微調。例如,如果您通過AJAX異步加載數據,則可能會有一些JavaScript回調在數據加載完成時觸發。這只是找出爲特定內容注入代碼的正確位置。 – cduhn 2010-05-13 17:59:41

0

是的,正如你發現的那樣,webViewDidFinishLoad會告訴你數據何時被加載到視圖中,但是沒有提供關於JS在完成後可能會發生什麼的信息。不幸的是UIWebView相當有限。你可以做的最好的事情是通過stringByEvaluatingJavaScriptFromString來查詢JS查詢。如果您可以運行一些JS來測試網絡視圖中的事情是否完成,那麼您可以每半秒鐘完成一次,並在獲得積極結果時解散微調器。