2012-07-10 15 views
5

Estoy escribiendo una aplicación de iOS, y tengo que mostrar un UIAlertView con un spinner. A veces, algo sale mal cuando trato de agregar la ruleta en el centro de la alerta, generalmente cuando había otra alerta justo antes de esta (no es exactamente una regla, pero así es como noté que falla).UIActivityIndicatorView no se muestra correctamente en UIAlertView

En parte resolví este error al retrasar la creación de la ruleta. Aquí es cómo lo hago (alerta es un miembro UIAlertView):

Este es el código de viewDidLoad:

alert = [[[UIAlertView alloc] initWithTitle:@"Loading..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; 

[alert show]; 

[self performSelector:@selector(addSpinner) withObject:nil afterDelay:0.5f]; 

Y éste es mi addSpinner función:

- (void) addSpinner{ 

    UIActivityIndicatorView *indicator2 = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 

    indicator2.center = CGPointMake(alert.bounds.size.width/2, alert.bounds.size.height - 50); 

    [indicator2 startAnimating]; 
    [alert addSubview:indicator2]; 
    [indicator2 release]; 
} 

Esta solución funciona siempre, pero realmente no me gusta cómo se hace. Aunque mostrar la ruleta medio segundo después de que la alerta aparece no es tan molesto, debe haber una forma mejor de manejar esto. No soy un experto en iOS, ni soy un programador senior, pero ¿no puedo usar un evento? Algo así como "cuando la alerta se muestra realmente, vaya a la función addSpinner"? No tengo idea de cómo hacer esto, y no pude encontrar mucha ayuda en la web ...

Espero que alguien me puede ayudar! Gracias.

Respuesta

5

En su lugar, puede usar https://github.com/jdg/MBProgressHUD.

y para spinner en alerta, puede utilizar estos métodos.

-(void)startLoading 
{ 
    alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Please Wait..." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil]; 

    UIActivityIndicatorView *progress= [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)]; 
    progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
    [alert addSubview:progress]; 
    [progress startAnimating]; 
    [progress release]; 
    [alert show]; 
} 
-(void)stopLoading 
{ 
    [alert dismissWithClickedButtonIndex:0 animated:YES]; 
    [alert release]; 
} 
+0

Gracias por eso, se ve bastante bien, puedo intentar usarlo. No puedo marcar su respuesta como mi "respuesta aceptada", ya que en realidad no resuelve el problema :) – rdurand

+1

sin problemas :) .. usted puede simplemente votar, si fue útil :) – waheeda

+1

He agregado un poco código para resolver su problema, espero que ayude. – waheeda

2

Prueba este

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
megaAlert = [[[UIAlertView alloc] initWithTitle:@"Please wait..." 
                 message:nil delegate:self cancelButtonTitle:nil 
               otherButtonTitles: nil] autorelease]; 
[megaAlert show]; 
indicator = [[UIActivityIndicatorView alloc]              initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
      indicator.center = CGPointMake(megaAlert.bounds.size.width/2,           megaAlert.bounds.size.height - 45); 
[indicator startAnimating]; 
[megaAlert addSubview:indicator]; 
[indicator release]; 

Para descartar el Indicador de utilizar este código

[megaAlert dismissWithClickedButtonIndex:0 animated:YES]; 
megaAlert = nil; 
[indicator stopAnimating]; 
+0

Gracias.Esto es básicamente lo que hice en primer lugar, sin descartar la alerta ... ¿Crees que puede afectar la posición del UIActivityIndicator? Te dejaré saber si funciona en unos minutos. – rdurand

+0

Parece que el problema aparece porque la posición del UIActivityIndicator está configurada antes de que se muestre UIAlertView. No creo que descartar la alerta solucione este problema ... – rdurand

1

Recuerde también para despedir alerta en hilo principal:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.alert dismissWithClickedButtonIndex:0 animated:YES]; 
}); 
4

Básicamente problema se ve a Agregar Add UIActivityIndicator antes de UIAl ertView se muestra. Intente utilizar el método Delegado UIAlertView para agregar el Indicador como se muestra a continuación.

//AlertView delegate methods 
- (void)didPresentAlertView:(UIAlertView *)alertView 
{ 
    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 

    indicator.center = CGPointMake(alertView.bounds.size.width/2, alertView.bounds.size.height/3 * 2); 

    [indicator startAnimating]; 
    [alertView addSubview:indicator]; 
} 
+1

Gracias por la respuesta tardía, puede solucionar el problema, pero ya no lo estoy afrontando, ya que utilicé MBProgressHUD. – rdurand

Cuestiones relacionadas