UIWebView no proporciona ninguna información de progreso en el modo normal. Lo que debe hacer primero es obtener sus datos de forma asincrónica utilizando un NSURLConnection. Cuando el método de delegado de NSURLConnection connection:didReceiveResponse
, tome el número que obtiene de expectedContentLength
y lo use como su valor máximo. Luego, dentro del método delegado connection:didReceiveData
, vas a utilizar la propiedad length
de la instancia de NSData para decirte qué tan avanzado estás, por lo que tu fracción de progreso será length/maxLength
, normalizada entre 0.0 y 1.0.
Finalmente, iniciará la vista web con datos en lugar de una URL (en su método delegado connection:didFinishLoading
).
Dos advertencias:
Es posible que la propiedad expectedContentLength
de la NSURLResponse va a ser -1 (NSURLReponseUnknownLength
constante). En ese caso, sugeriría arrojar un UIActivityIndicator estándar que apaga dentro de connection:didFinishLoading
.
Asegúrese de que cada vez que manipule un control visible desde uno de los métodos de delegado de NSURLConnection, puede hacerlo llamando al performSelectorOnMainThread:
; de lo contrario, comenzará a recibir los temidos errores EXC_BAD_ACCESS.
Usando esta técnica, usted puede mostrar una barra de progreso cuando se conoce la cantidad de datos que se supone que conseguir, y una ruleta cuando no se sabe.
El problema con la implementación de la obtención de datos de NSURLConnection sobre la solicitud de carga de UIWebView es que está obteniendo los mismos datos dos veces, lo que es inútil en una conexión liviana. Puede cargar la instancia de NSData directamente en UIWebView con 'loadData: MIMEType: textEncodingName: baseURL:', pero esto puede comprometer otras facetas del uso de UIWebView. –