UIWebView相关协议方法总结

UIWebView Private Method


  • UIWebView dump method:UIWebView.h
  • 设置UIWebViewWebThread线程下进行渲染,不占用主线程,代码如下:
    1
    2
    [_webView performSelector:@selector(_setDrawInWebThread:) withObject:@YES];
    [_webView performSelector:@selector(_setDrawsCheckeredPattern:) withObject:@YES];

WebResourceLoadDelegate Protocol


  • - (id)webView:(WebView *)sender identifierForInitialRequest:(NSURLRequest *)request fromDataSource:(WebDataSource *)dataSource

    该方法返回一个标识符对象,网页中的每一个资源都会调用该方法。资源包括网页中嵌入的图片、脚本、CSS、嵌入在frame中的页面。

UIWebViewDelegate Protocol


  • - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

    webView在加载一个frame之前会回调该方法,加载frame的情形包括加载新的页面、加载iframe的url时。navigationType变量是一个枚举值,标识用户的动作,如点击、提交表单、前进、重载、重新提交表单、以及其他,其他包括重定向等。(注意,调用该方法,并不代表会发生真正的服务器请求,比如fragment

  • - (void)webViewDidFinishLoad:(UIWebView *)webView

    注意,该方法并不是表示webView完成了网页的加载,而是表示完成了一个frame的加载,所以可能会出现加载一个网页时被调用多次的情况。

  • - (void)webViewDidStartLoad:(UIWebView *)webView

    当webView开始加载frame时调用,注意,该方法不管加载是否成功都会调用。

WebFrameLoadDelegate Protocol


  • - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame

    frame完成时调用,既frame的所有资源都已经加载完成。WebFrame封装了一个单独的frame元素,而一个完整的页面则由一个WebFrame的层级树组成,根WebFrame称为main frame,每一个WebFrame都对应一个WebFrameView,其用来显示frame的内容。

  • - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame

    frame获取到title时调用,该方法可能会被调用多次,想要及时更新标题的话可以实现该方法。

相关概念


  1. 在请求资源数据时,由于是异步的,所以可能成功,也可能失败,因此Data Sources就分为ProvisionalCommitted。一开始,data sourceProvisional的,因为还不知道页面是否会加载成功,只要有响应数据到来,data source就将变成Committed的。