2009-12-14 10 views
11

estoy desarrollando una aplicación en la que estoy cargando una urlrequest en UIWebView y sucedió con éxito.¿Cómo usar UIProgressView mientras se carga un UIWebView?

Pero ahora estoy tratando de mostrar un UIProgressView cuando la carga está en progreso (comenzando desde 0.0 a 1.0), que se cambia dinámicamente con el progreso de la carga.

¿Cómo puedo hacer eso?

Respuesta

21

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:

  1. 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.

  2. 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.

+0

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. –

2

Puede intentar usar esta subclase de UIWebView que usa los métodos privados UIWebView; por lo tanto, esta solución no es 100% segura para AppStore (aunque algunas aplicaciones casi lo usan al 100%: Facebook, Google app, ...) .

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

-2

Usando NSURLConnection estás obteniendo los mismos datos dos veces, pérdida de tiempo, ya que puede ralentizar la interacción con el usuario carga los datos dos veces, consume data.It Internet es mejor hacer una uiprogress basa en y cuando la vista web cargue exitosamente la página web, mostrará el mensaje que se carga. En ese caso, puede mostrar un desplazamiento dinámico cada vez que se cargue la página web. No olvide crear una vista de progreso y asígnela myProgressview y configúrela en el propietario del archivo .

está aquí CÓDIGO creo que sirve

@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 

este código e idea realmente me ayuda a resolver mi problema.

Cuestiones relacionadas