iphone - ¿Cómo usar UIProgressView mientras se carga un UIWebView?
(3)
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, ...).
Estoy desarrollando una aplicación donde estoy cargando una urlrequest en UIWebView y sucedió con éxito.
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?
UIWebView no proporciona 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 la connection:didReceiveResponse
método de delegado NSURLConnection connection:didReceiveResponse
, vas a tomar el número que obtienes de expectedContentLength
y lo usas como tu valor máximo. Luego, dentro de la connection:didReceiveData
método delegado connection:didReceiveData
, vas a usar la propiedad length
de la instancia NSData para decirte qué tan avanzado estás, por lo que la 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 connection:didFinishLoading
método delegado connection:didFinishLoading
).
Dos advertencias:
Es posible que la propiedad
expectedContentLength
de NSURLResponse sea -1 (constanteNSURLReponseUnknownLength
). En ese caso, sugeriría arrojar un UIActivityIndicator estándar que desconectó dentro de laconnection:didFinishLoading
.Asegúrese de que cada vez que manipule un control visible desde uno de los métodos de delegado de NSURLConnection, lo haga llamando a
performSelectorOnMainThread:
contrario, comenzará a obtener los temidos errores EXC_BAD_ACCESS.
Al usar esta técnica, puede mostrar una barra de progreso cuando sabe la cantidad de datos que se supone que debe obtener, y un marcador cuando no lo sabe.
Al usar NSURLConnection está obteniendo los mismos datos dos veces, pérdida de tiempo porque puede ralentizar la interacción del usuario. Carga los datos dos veces, consume datos de Internet. Es mejor realizar un cambio basado en el temporizador y cuando la vista web cargó exitosamente la página web. le mostrará la carga de un mensaje emergente. En ese caso, puede mostrar un mensaje de usuario 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.
AQUÍ ESTÁ EL CÓDIGO ESPERANZA QUE AYUDA
@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.