2012-07-10 18 views
5

Piszę aplikację na iOS i muszę wyświetlić UIAlertView za pomocą pokrętła. Czasami coś jest nie tak, gdy próbuję dodać spinner w centrum alertu, zwykle gdy pojawił się inny alert tuż przed tym (niekoniecznie reguła, ale tak zauważyłem, że się nie udało).UIActivityIndicatorView nie wyświetla się poprawnie na UIAlertView

Częściowo rozwiązałem ten błąd, opóźniając tworzenie przędzarki. Oto jak to zrobić (alert jest członkiem UIAlertView):

Ten kod jest w 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]; 

I to jest moim addSpinner funkcja:

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

To rozwiązanie działa za każdym razem, ale naprawdę nie podoba mi się, jak to się robi. Nawet pokazanie spinnera pół sekundy po pojawieniu się alarmu nie jest tak niepokojące, musi być lepszy sposób na poradzenie sobie z tym. Nie jestem ekspertem od iOS, ani nie jestem starszym programistą, ale czy nie mogę skorzystać z wydarzenia? Coś takiego jak "kiedy alert jest rzeczywiście wyświetlany, przejdź do funkcji addSpinner"? Nie mam pojęcia, jak to zrobić i nie mogłem znaleźć zbytniej pomocy w Internecie ...

Mam nadzieję, że ktoś może mi pomóc! Dzięki.

Odpowiedz

5

Zamiast tego można użyć https://github.com/jdg/MBProgressHUD.

i dla spinnera w ramach alertu możesz użyć tych metod.

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

Dzięki temu wygląda całkiem nieźle, mogę spróbować go użyć. Nie mogę oznaczyć twojej odpowiedzi jako mojej "zaakceptowanej odpowiedzi", ponieważ to naprawdę nie rozwiązuje problemu :) – rdurand

+1

żadnych problemów :) .. możesz po prostu oddać głos, jeśli to było pomocne :) – waheeda

+1

Dodałem trochę kod, aby rozwiązać twój problem, mam nadzieję, że to pomoże. – waheeda

2

Spróbuj

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

Aby zamknąć wskaźnik użyć tego kodu

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

Dzięki.To jest zasadniczo to, co zrobiłem w pierwszej kolejności, bez odrzucania ostrzeżenia ... Czy uważasz, że może to wpłynąć na pozycję UIActivityIndicator? Dam ci znać, jeśli zadziała w ciągu kilku minut. – rdurand

+0

Wygląda na to, że problem pojawia się, ponieważ pozycja wskaźnika UIActivity jest ustawiona przed wyświetleniem UIAlertView. Nie sądzę, że odrzucenie alertu rozwiąże ten problem ... – rdurand

1

Pamiętaj również, aby zamknąć alert w głównym wątku:

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

Zasadniczo problemem wygląda na dodawać UIActivityIndicator przed UIAl ertView jest wyświetlany. Spróbuj użyć metody UIAlertView Delegate, aby dodać wskaźnik jak poniżej.

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

Dzięki za spóźnioną odpowiedź, może to rozwiązać problem, ale nie stoję już w obliczu tego, ponieważ użyłem MBProgressHUD. – rdurand

Powiązane problemy