Как использовать UIProgressView при загрузке UIWebView?
Я разрабатываю приложение, в котором я загружаю urlrequest в UIWebView, и это произошло успешно.
Но теперь я пытаюсь отобразить UIProgressView, когда выполняется загрузка (начиная с 0.0 до 1.0), которая динамически изменяется с ходом загрузки.
Как я могу это сделать?
Ответы
Ответ 1
UIWebView не дает вам никакой информации о ходе работы в обычном режиме. Что вам нужно сделать, это сначала получить ваши данные асинхронно, используя NSURLConnection.
Когда метод делегата NSURLConnection connection:didReceiveResponse
, вы берете номер, который вы получаете от expectedContentLength
, и используете это как максимальное значение. Затем внутри метода делегата connection:didReceiveData
вы будете использовать свойство length
экземпляра NSData, чтобы рассказать вам, насколько далеко вы находитесь, поэтому ваша доля прогресса будет length / maxLength
, нормализована на 0,0 0.0.
Наконец, вы собираетесь запустить веб-просмотр с данными вместо URL-адреса (в вашем методе делегата connection:didFinishLoading
).
Два оговорки:
-
Возможно, что свойство expectedContentLength
для NSURLResponse будет -1 (NSURLReponseUnknownLength
constant). В этом случае я бы предложил запустить стандартный идентификатор UIActivityIndicator, который вы отключили внутри connection:didFinishLoading
.
-
Убедитесь, что в любое время, когда вы манипулируете видимым элементом управления из одного из методов делегата NSURLConnection, вы делаете это, вызывая performSelectorOnMainThread:
- иначе вы начнете получать ужасные ошибки EXC_BAD_ACCESS.
Используя этот метод, вы можете показать индикатор выполнения, когда знаете, сколько данных вы должны получить, и счетчик, если вы этого не знаете.
Ответ 2
Вы можете попытаться использовать этот подкласс UIWebView, который использует частные методы UIWebView, поэтому это решение не является 100% -ным безопасным AppStore (хотя некоторые приложения почти на 100% используют его: Facebook, приложение Google,...).
https://github.com/petr-inmite/imtwebview
Ответ 3
Используя NSURLConnection, вы дважды извлекаете одни и те же данные, теряете время, потому что это может замедлить взаимодействие пользователя, он дважды загружает данные, потребляет интернет-данные. Лучше сделать uiprogress на основе таймера и когда webview успешно загрузил веб-страницу, показывая загрузку uiprogress. В этом случае вы можете показывать динамический uiprogress каждый раз, когда загружается веб-страница. Не забудьте создать представление uiprogress и назовите его myProgressview и установите его в владельце файла.
ЗДЕСЬ КОД НАДЕЕТСЯ, ЧТО ПОМОГАЕТ
@synthesize myProgressView;
- (void)updateProgress:(NSTimer *)sender
{ //if the progress view is = 100% the progress stop
if(myProgressView.progress==1.0)
{
[timer invalidate];
}
else
//if the progress view is< 100% the progress increases
myProgressView.progress+=0.5;
}
- (void)viewDidLoad
{ //this is the code used in order to load the site
[super viewDidLoad];
NSString *urlAddress = @"http://www.playbuzz.org/";
myWebview.delegate = self;
[myWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlAddress]]];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{ ///timer for the progress view
timer=[[NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(updateProgress:)
userInfo:myProgressView
repeats:YES]retain];
}
- (void)dealloc {
[myProgressView release];
[super dealloc];
}
@end
этот код и идея действительно помогают мне в решении моей проблемы.