如何区分来自LoadHtmlString的请求与事件ShouldStartLoad中的网页请求?

时间:2011-08-20 08:05:46

标签: objective-c xamarin.ios monodevelop

我已经在我的UIWebView中构建了离线功能,这样当iPhone进入航空公司模式时,已加载的页面仍然可用。基本算法是:

1)检测 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);
    }
}

对于那些只了解Objective C的人,你可以看到在这个问题的答案中解释的相同类型的机制:

Question about UIWebview when tapping links

这个基本算法适用于我的大多数网页,但是从javascript而不是点击链接的请求有问题。如果我的javascript window.location.href = URL ,那么我在 ShouldStartLoad 事件中看到的导航类型是其他,而不是 LinkClicked 。因此,这些请求不会被发送到我的脱机缓存。来自LoadHtmlString的请求也有其他的导航类型,因此根据导航类型,我无法区分我的页面中的LoadHtmlString和javascript请求的请求。

所以基本上,我需要改变这行代码:

if (navigationType == UIWebViewNavigationType.LinkClicked) {

更好地区分来自我的网页的请求和来自 OfflineRequestSuccess LoadHtmlString 的请求。任何人都有任何想法,我怎么可能做出这种区分?

1 个答案:

答案 0 :(得分:1)

如果在使用LoadHtmlString时将委托的布尔属性设置为true并在完成时重置它,则可以轻松区分这些属性。 Web视图不知道该属性,也不会将其设置为true。如果属性为YES,则必须是因为LoadHtmlString请求。