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