Как использовать 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

этот код и идея действительно помогают мне в решении моей проблемы.