2011-03-10 4 views
1

J'utilise UIAlertView avec "please wait" et UIActivityIndicatorView. Je l'affiche en utilisantproblème rejetant UIAlertView

{ 
    ... 
    [self performSelectorInBackground:@selector(sh) withObject:nil]; 
    //i've tried also 
    //[NSThread detachNewThreadSelector:@selector(showWaiting) toTarget:self withObject:nil]; 
    ... 
} 

- (void)showWaiting { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [waitingAlert show]; 
    [pool drain]; 
} 

Lorsque l'alerte apparaît, l'écran devient sombre et inactif. Et quand le temps de rejeter l'alerte est je

[waitingAlert dismissWithClickedButtonIndex:0 animated:NO]; 

Après cette alerte disparaît, mais parfois (la chance est d'environ 5%) l'écran reste comme avant assombri et inactif. Est-ce que quelqu'un a fait face à un tel problème? Merci!

+0

est "@selector (sh)" est une erreur? Il n'y a pas de méthode 'sh' définie ci-dessus. – occulus

+0

Nous devons voir plus de code s'il vous plaît. Où appelez-vous dismissWithClickedButtonIndex: from? – occulus

Répondre

3

Ce n'est pas la réponse que vous cherchez ... mais il est la « bonne » réponse et vous faire gagner du temps à long terme:

Vous abusant UIAlertView. Il ne doit pas être utilisé pour les indicateurs de progression et les boîtes de dialogue "Please Wait". Il est conçu pour être rejeté par l'utilisateur en appuyant sur un bouton - un UIAlertView ne devrait jamais, jamais disparaître tout seul (correction: en fait, il peut, l'API d'Apple soutient le rejet de celui-ci. Si vous continuez à abuser de UIAlertView de cette façon, ne soyez pas surpris lorsque votre application est rejetée lors de la soumission de l'app store et que vous devez la refaire d'une autre manière.

S'il vous plaît voir aussi ma réponse à cette question:

Multiple AlertViews - Remove the alertview that is behind another alertview

1

états Comme Occulus éviter d'utiliser UIAlertView comme ça,

Je recommande MBProgressHUD, il est très facile à utiliser, ressemble beaucoup et est conçu dans ce but.

0

Vous devez créer, afficher et libérer l'alerte en dehors du NSAutoreleasePool. Par exemple, vous faites votre appel en arrière-plan:

... 
[NSThread detachNewThreadSelector:@selector(showWaiting) toTarget:self withObject:nil]; 
... 

Et l'appel a une piscine autorelease:

- (void)showWaiting { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self performSelectorInMainThread:@selector(showMyAlert) withObject:nil waitUntilDone:NO]; 
    //[waitingAlert show]; 
    [pool drain]; 
} 

Ensuite, vous devez montrer à l'alerte en utilisant le thread principal.

- (void)showMyAlert { 
    UIAlertView * myAlert = [[UIAlertView alloc] initWith...]; 
    [myAlert show]; 
    [myAlert release]; 
} 

Si vous essayez de montrer l'alerte dans la piscine autorelease et cela est drainée alors les dissapears d'alerte.

J'espère que cela aide!