2012-07-10 11 views
5

Sto scrivendo un'app per iOS e devo visualizzare un UIAlertView con uno spinner. A volte,, qualcosa va storto quando provo ad aggiungere lo spinner al centro dell'avviso, di solito quando c'era un altro avviso proprio prima di questo (non esattamente una regola, ma è così che ho notato che fallisce).UIActivityIndicatorView non visualizzato direttamente su UIAlertView

Ho parzialmente risolto questo errore ritardando la creazione dello spinner. Ecco come lo faccio (avviso è membro UIAlertView):

Questo codice è in 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]; 

E questo è il mio addSpinner funzione:

- (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]; 
} 

Questa soluzione funziona sempre, ma non mi piace come sia fatta. Anche se mostrare lo spinner mezzo secondo dopo che l'avviso si apre non è così fastidioso, ci deve essere un modo migliore per gestirlo. Non sono un esperto di iOS, né sono un programmatore esperto, ma non posso utilizzare un evento? Qualcosa come "quando viene effettivamente visualizzato l'avviso, vai alla funzione addSpinner"? Non ho idea di come fare questo, e non ho potuto trovare molto aiuto sul web ...

Spero che qualcuno possa aiutarmi! Grazie.

risposta

5

È possibile utilizzare invece https://github.com/jdg/MBProgressHUD.

e per lo spinner all'interno di avviso, è possibile utilizzare questi metodi.

-(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

Grazie per quello, sembra abbastanza buono, potrei provare ad usarlo. Non posso contrassegnare la tua risposta come la mia "risposta accettata", in quanto in realtà non risolve il problema :) – rdurand

+1

nessun problema :) .. puoi semplicemente votare, se è stato utile :) – waheeda

+1

Ho aggiunto alcuni codice per risolvere il tuo problema, spero che possa aiutarti. – waheeda

2

Prova questo

[[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]; 

Per chiudere l'indicatore di utilizzare questo codice

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

Grazie.Questo è fondamentalmente ciò che ho fatto in primo luogo, senza ignorare l'avviso ... Pensi che possa influire sulla posizione di UIActivityIndicator? Ti farò sapere se funziona tra qualche minuto. – rdurand

+0

Sembra davvero che il problema venga visualizzato perché la posizione di UIActivityIndicator è impostata prima che UIAlertView venga visualizzato. Non credo che il licenziamento risolva questo problema ... – rdurand

1

Ricorda inoltre di respingere allarme nel thread principale:

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

Fondamentalmente problema guarda al aggiungere UIActivityIndicator prima di UIAl ertView viene visualizzato. Prova ad usare il metodo Delegato di UIAlertView per aggiungere l'indicatore come sotto.

//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

Grazie per la risposta in ritardo, potrebbe risolvere il problema, ma non lo sto più affrontando, dato che ho usato MBProgressHUD. – rdurand

Problemi correlati