2013-02-21 2 views
1

Je fais une application qui devrait supporter les versions iOS à partir d'iOS5. Il utilise un UIAlertView, et s'il est visible lorsque l'utilisateur clique sur le bouton d'accueil, je voudrais qu'il soit rejeté avant que l'utilisateur ne retourne à l'application (c'est-à-dire quand l'application est rouverte en utilisant le multitâche). Toutes les méthodes dans le délégué de l'application l'affichent comme non visible (isVisible = NO) même si elle est toujours visible lors de la réouverture. Y a-t-il un moyen de faire cela?Comment ignorer UIAlertView lorsque le bouton d'accueil est enfoncé?

Merci. Gardez une référence au UIAlertView affiché dans le délégué de votre application.

Répondre

7

Ou vous héritez votre classe de UIAlertView et ajoutez observateur NSNotification pour UIApplicationWillResignActiveNotification et lorsque la notification se produit appel à alertview méthode dismissWithClickedButtonIndex:

Exemple: .h

#import <UIKit/UIKit.h> 

@interface ADAlertView : UIAlertView 

@end 

fichier .m

#import "ADAlertView.h" 

@implementation ADAlertView 

- (void) dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (id) initWithTitle:(NSString *)title 
      message:(NSString *)message 
      delegate:(id)delegate 
    cancelButtonTitle:(NSString *)cancelButtonTitle 
    otherButtonTitles:(NSString *)otherButtonTitles, ... { 
    self = [super initWithTitle:title 
         message:message 
         delegate:delegate 
       cancelButtonTitle:cancelButtonTitle 
       otherButtonTitles:otherButtonTitles, nil]; 

    if (self) { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(dismiss:) 
       name:UIApplicationDidEnterBackgroundNotification 
       object:nil]; 
    } 

    return self; 
} 

- (void) dismiss:(NSNotification *)notication { 
    [self dismissWithClickedButtonIndex:[self cancelButtonIndex] animated:YES]; 
} 

@end 

Avec votre propre classe héritée de UIAlertView, vous n'avez pas besoin Pour stocker un lien vers alertview ou autre chose, une seule chose que vous devez faire est de remplacer UIAlertView par ADAlertView (ou tout autre nom de classe). Ne hésitez pas à utiliser cet exemple de code (si vous ne l'utilisez ARC, vous devez ajouter à la méthode dealloc [super dealloc] après [[NSNotificatioCenter defaultCenter] removeObserver:self])

+0

Cela peut fonctionner, mais selon la documentation * "La classe UIAlertView est destinée à être utilisée telle quelle et ne supporte pas la sous-classe" *. –

+0

de toute façon c'est mieux, que stocker un lien vers toutes les alertes, que vous devez dissmiss, lorsque l'application entre en arrière-plan –

+1

@MartinR Je crois que son type de sous-classement est "sûr". Je pense que l'intention de la note dans les docs sur la sous-classe est d'empêcher les gens de sous-classer dans le but de modifier l'interface utilisateur ou d'effectuer d'autres opérations de déblayage non sécuritaires. – rmaddy

4

Lorsque vous affichez l'alerte, définissez la référence. lorsque l'alerte est rejetée, nil sur la référence.

Dans la méthode applicationWillResignActive: ou de votre délégué d'application, appelez la méthode dismissWithClickedButtonIndex:animated: sur la référence à la vue d'alerte. Cela prendrait soin de le rejeter en appuyant sur le bouton "home". Gardez à l'esprit que applicationWillResignActive: sera appelé pour des appels téléphoniques, par exemple, vous devez décider si vous souhaitez ignorer l'alerte dans les cas de ce genre ou si vous devez continuer à l'appeler.

+3

I * pense * que 'applicationWillResignActive' est également appelé à des interruptions temporaires telles que les appels téléphoniques entrants ou SMS, donc 'applicationDidEnterBackground' pourrait être un meilleur choix. –

+0

@MartinR Merci beaucoup pour votre commentaire! J'ai édité la réponse pour le refléter. – dasblinkenlight

+0

Ceci, mais certainement utiliser 'applicationDidEnterBackground'! – Hyperbole

Questions connexes