2011-08-20 29 views
0

我已將離線功能構建到我的UIWebView中,以便在iPhone進入航空公司模式時,已加載的頁面仍可用。基本算法是:如何在事件ShouldStartLoad中區分來自網頁請求的來自LoadHtmlString的請求?

1)detect NavigationType LinkClicked並且在這種情況下從離線緩存中加載請求的頁面; 2)當離線緩存完成加載請求的URL時,它會觸發offlineRequestSuccess通知;

3)我的webview處理此通知並將響應字符串加載到webview中。

這是我做這個代碼:

public class UIMobileformsWebView : UIWebView 
{   
    private UIMobileformsWebView() : base() 
    { 
     UIWebView self = this; 
     this.ShouldStartLoad = (webview, request, navigationType) => {     
      if (navigationType == UIWebViewNavigationType.LinkClicked) { 
       OfflineRequest.GetInstance().FetchUrl(request.URL); 
       return false; 
      } 
      return true; 
     }; 
     NSNotificationCenter.DefaultCenter.AddObserver(new NSString("offlineRequestSuccess"), new Action<NSNotification>(OfflineRequestSuccess)); 
    } 

    void OfflineRequestSuccess (NSNotification notification) 
    { 
     ASIHTTPRequest theRequest = (ASIHTTPRequest)notification.Object; 
     String response = System.IO.File.ReadAllText(theRequest.DownloadDestinationPath); 
     this.LoadHtmlString(response, theRequest.URL); 
    } 
} 

對於那些只知道目標C,你可以看到同樣類型的機構在這個問題的答案解釋:

Question about UIWebview when tapping links

這個基本算法適用於我的大多數網頁,但是在使用javascript而不是點擊鏈接的問題上存在問題。如果我的JavaScript並window.location.href =網址然後導航型,我在ShouldStartLoad事件看到的是鍵入其他,不LinkClicked。因此,這些請求不會發送到我的脫機緩存。來自LoadHtmlString的請求也具有導航類型其他,因此基於導航類型,我無法區分LoadHtmlString和JavaScript頁面中的請求。

所以基本上,我需要改變這行代碼:

if (navigationType == UIWebViewNavigationType.LinkClicked) { 

的東西,尤爲明顯區分請求從我的網頁來了,並且請求從LoadHtmlString OfflineRequestSuccess進來。任何人有任何想法,我怎麼可以作出這種區別?

回答

1

如果您在使用LoadHtmlString時將代表的布爾屬性設置爲true,並且在完成時重置它,則可以輕鬆區分這些代碼。 Web視圖不知道該屬性,它不會將其設置爲true。如果它的屬性是YES,則它必須是因爲LoadHtmlString請求。