【问题标题】:Add activity indicator to web view将活动指示器添加到 Web 视图
【发布时间】:2012-07-04 19:00:09
【问题描述】:

我想将活动指示器添加到 Web 视图。 但我不知道 web 视图何时完成加载。 我开始在 viewdidload 中制作动画..

【问题讨论】:

    标签: ios webview uiactivityindicatorview


    【解决方案1】:

    您不应该在 viewDidLoad 中开始制作动画。符合

    UIWebViewDelegate
    

    协议并使您的 Web 视图的委托成为您的视图控制器,然后使用委托方法:

    @interface MyVC: UIViewController <UIWebViewDelegate> {
        UIWebView *webView;
        UIActivityIndicatorView *activityIndicator;
    }
    
    @end
    
    @implementation MyVC
    
    - (id)init
    {
        self = [super init];
        // ...
    
        activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        activityIndicator.frame = CGRectMake(x, y, w, h);
        [self.view addSubview:activityIndicator];
    
        webView = [[UIWebView alloc] initWithFrame:CGRectMake(x, y, w, h)];
        webView.delegate = self;
        // ...
        return self;
    }
    
    - (BOOL)webView:(UIWebView *)wv shouldStartLoadWithRequest:(NSURLRequest *)rq
    {
        [activityIndicator startAnimating];
        return YES;
    }
    
    - (void)webViewDidFinishLoading:(UIWebView *)wv
    {
        [activityIndicator stopAnimating];
    }
    
    - (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error
    {
        [activityIndicator stopAnimating];
    }
    
    @end
    

    【讨论】:

    • 顺便说一下,在didFailLoadWithError 中,如果您想要做类似的事情,通知用户一些网页浏览问题,值得注意的是error.code == NSURLErrorCancelled 不是致命错误,而是一个指示UIWebView 将尝试转到另一个页面(因为用户在加载过程中点击了链接,或者有时甚至因为网站本身正在重定向用户)。简而言之,如果您打算在didFailLoadWithError 中做任何更全面的事情,您可能需要检查error.code != NSURLErrorCancelled
    • 是的,但这不是 OP 问题的一部分。
    • 同意。没有批评的意思。只是对 user1502286 的观察,关于这些原本非常直观的 UIWebViewDelegate 方法的一个奇怪的小怪癖。
    • 谢谢。我成功地将活动指示器视图添加到我的 Web 视图中。但是还有一个问题,我跟着你的代码,但是我的程序没有加载“-(id) init”。
    • 这不是字面意思:) 如果你使用InterfaceBuilder,可能会调用一些pther方法而不是显式init,例如initWithNibName:Bundle:等。
    【解决方案2】:

    实现UIWebViewDelegate 协议 这些是您需要在代码中实现的委托:

    - (void)webViewDidStartLoad:(UIWebView *)webView; //a web view starts loading
    - (void)webViewDidFinishLoad:(UIWebView *)webView;//web view finishes loading
    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error; //web view failed to load
    

    【讨论】:

    • 谢谢这个帮助我。
    • 如果我正在查看的网站中有多个框架,这些函数被多次触发是否正常?这些函数如何只为父窗口触发?
    【解决方案3】:

    您将需要侦听 Web 视图委托回调以正确显示您的活动指示器。

    你会特别想听:

    webViewDidStartLoad:(启动您的活动指示器动画)

    webViewDidFinishLoad:(结束)

    webView:didFailLoadWithError:(结束)

    http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html

    【讨论】:

      【解决方案4】:
      - (void)viewDidLoad {
      [super viewDidLoad];
      // Do any additional setup after loading the view.
      
      self.webViewRef.delegate = self;
      NSURL *websiteUrl = [NSURL URLWithString:Constants.API_TERMS_AND_CONDITIONS_URL];
      NSURLRequest *urlRequest = [NSURLRequest requestWithURL:websiteUrl];
      [self.webViewRef loadRequest:urlRequest];
      }
      
      #pragma mark
      #pragma  mark -- UIWebViewDelegate
      - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
      [self.activityIndicator startAnimating];
      return YES;
      }
       - (void)webViewDidStartLoad:(UIWebView *)webView{
      [self.activityIndicator startAnimating];
       }
        - (void)webViewDidFinishLoad:(UIWebView *)webView{
      [self.activityIndicator stopAnimating];
      self.activityIndicator.hidden = YES;
       }
      - (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{
      [self.activityIndicator stopAnimating];
      self.activityIndicator.hidden = YES;
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 2016-04-18
        相关资源
        最近更新 更多