Как использовать UIProgressView при загрузке UIWebView? - PullRequest
11 голосов
/ 14 декабря 2009

Я занимаюсь разработкой приложения, в которое загружаю URL-запрос в UIWebView, и это успешно произошло.

Но теперь я пытаюсь отобразить UIProgressView во время загрузки (начиная с 0.0 до 1.0), который динамически изменяется с ходом загрузки.

Как я могу это сделать?

Ответы [ 3 ]

22 голосов
/ 15 декабря 2009

UIWebView не дает никакой информации о прогрессе в обычном режиме. Что вам нужно сделать, это сначала получить ваши данные асинхронно, используя NSURLConnection. Когда метод делегата NSURLConnection connection:didReceiveResponse, вы берете число, которое вы получаете от expectedContentLength, и используете его как максимальное значение. Затем, внутри метода делегата connection:didReceiveData, вы будете использовать свойство length экземпляра NSData, чтобы сообщать вам, как далеко вы продвинулись, поэтому ваша доля прогресса будет length / maxLength, нормализованная между 0,0 и 1,0 .

Наконец, вы собираетесь инициировать веб-просмотр с данными вместо URL (в вашем connection:didFinishLoading методе делегата).

Два предостережения:

  1. Возможно, что свойство expectedContentLength NSURLResponse будет -1 (NSURLReponseUnknownLength постоянная). В этом случае я бы предложил вызвать стандартный UIActivityIndicator, который вы отключили внутри connection:didFinishLoading.

  2. Убедитесь, что каждый раз, когда вы манипулируете видимым элементом управления из одного из методов делегата NSURLConnection, вы делаете это, вызывая performSelectorOnMainThread: - в противном случае вы начнете получать страшные ошибки EXC_BAD_ACCESS.

Используя эту технику, вы можете показать индикатор выполнения, когда вы знаете, сколько данных вы должны получить, и счетчик, если вы не знаете.

2 голосов
/ 24 ноября 2011

Вы можете попытаться использовать этот подкласс UIWebView, который использует частные методы UIWebView - следовательно, это решение не на 100% безопасно AppStore (хотя некоторые приложения используют его почти на 100%: Facebook, Google app, ...)

https://github.com/petr-inmite/imtwebview

0 голосов
/ 04 октября 2013

Используя 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

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

...