2011-08-20 60 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请求。