Добавить индикатор активности в веб-представление

Я хочу добавить индикатор активности в веб-представление. Но я не знаю, когда завершится загрузка веб-представления. Я начинаю анимировать в viewdidload..


person user1502286    schedule 04.07.2012    source источник


Ответы (3)


Вы не должны начинать анимацию в viewDidLoad. Соответствовать

UIWebViewDelegate

протокол и сделайте свой веб-представление делегатом вашего контроллера представления, затем используйте методы делегата:

@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
person Community    schedule 04.07.2012
comment
Между прочим, в didFailLoadWithError, если вы когда-либо хотели сделать что-то вроде информирования пользователя о какой-либо проблеме с просмотром веб-страниц, стоит отметить, что error.code == NSURLErrorCancelled не является фатальной ошибкой, а скорее указывает на то, что UIWebView попытается перейти на другую страницу. (либо потому, что пользователь нажал на ссылку во время загрузки, либо иногда даже потому, что сам веб-сайт перенаправляет пользователя). Короче говоря, если вы когда-нибудь планируете сделать что-то более всеобъемлющее в didFailLoadWithError, вы можете проверить наличие error.code != NSURLErrorCancelled. - person Rob; 05.07.2012
comment
Да, но это не было частью вопроса ОП. - person ; 05.07.2012
comment
Согласованный. Никакой критики не предполагалось. Просто наблюдение для пользователя 1502286 о странной маленькой причуде этих в остальном довольно интуитивных UIWebViewDelegate методов. - person Rob; 05.07.2012
comment
Спасибо. Я успешно добавляю представление индикатора активности в свое веб-представление. Но есть еще одна проблема, я следовал вашему коду, но моя программа не загрузилась -(id) init. - person user1502286; 07.07.2012
comment
Это не следует воспринимать буквально :) Если вы используете InterfaceBuilder, вместо явной инициализации могут быть вызваны некоторые другие методы, такие как initWithNibName:Bundle: и т.д. - person ; 07.07.2012
comment
Нужно использовать webViewDidFinishLoad вместо webViewDidFinishLoading . Спасибо! - person Pavlo Razumovskyi; 23.09.2015

Реализуйте протокол 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
person Midhun MP    schedule 04.07.2012
comment
Спасибо, это поможет мне. - person Kundan; 17.09.2013
comment
Нормально ли, что эти функции запускаются несколько раз, если на просматриваемом веб-сайте есть несколько фреймов? Как эти функции могут срабатывать только для родительского окна? - person thefoyer; 26.02.2014

Вам нужно будет прослушивать обратные вызовы делегата веб-представления, чтобы правильно отображать индикатор активности.

В частности, вы захотите послушать:

webViewDidStartLoad: (запустите анимацию индикатора активности)

webViewDidFinishLoad: (завершить)

webView: didFailLoadWithError: (завершить)

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

person rooster117    schedule 04.07.2012