Question

Le protocole UIAlertviewDelegate dispose de plusieurs méthodes optionnelles dont:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

Cela semble suggérer que tous les clics de bouton rejeter en fait l'affichage des alertes. Cependant, je ne vois aucun moyen de configurer l'affichage des alertes de rejeter pas automatiquement une pression sur le bouton.

Dois-je créer une sous-classe pour y parvenir?

Pourquoi le Protocole UIAlertViewDelegate avoir:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex;
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

Si elle ne prend pas en charge le cas échéant pas rejeter l'affichage des alertes à chaque cliquez sur le bouton?

En plus bref: Je me rends compte que UIAlertView a été conçu pour. Mais mon but est de permettre à l'utilisateur de copier un texte sur la carte de la pâte avant la sortie app (ce qui se produit automatiquement lorsque l'affichage des alertes est rejetée.

Était-ce utile?

La solution

Oui. UIAlertView puis sous-classe surcharge -dismissWithClickedButtonIndex:animated:, par exemple.

@implementation MyAlertView 
-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {
   if (buttonIndex should not dismiss the alert)
      return;
   [super dismissWithClickedButtonIndex:buttonIndex animated:animated];
}
@end

Officieusement vous pouvez définir un

-(void)alertSheet:(UIAlertSheet*)sheet buttonClicked:(id)button;

méthode au délégué qui en fera contourner -dismissWithClickedButtonIndex:animated:, mais il est non documentées , donc je ne sais pas s'il est approprié pour vous.

Autres conseils

willPresentAlertView:, didPresentAlertView:, alertView:willDismissWithButtonIndex: et alertView:didDismissWithButtonIndex: sont pour suivre le début et la fin des animations de UIAlertView.

Les applications qui ne ont pas besoin de suivre les animations de UIAlertView peuvent simplement utiliser alertView:clickedButtonAtIndex:. Les documents pour cette méthode dire « le récepteur est rejeté automatiquement après cette méthode est appelée. »

A mon avis: Il n'y a aucune raison de garder alertView. Même si vous voulez le garder, il suffit de penser « re-présentation » il, en gardant une référence, puis appelez [alertView show] ==> PAS BESOIN DE QUOI QUE CE SOIT LA SOUS-CLASSE . De bonnes nouvelles, hein?

  

AVERTISSEMENT

     

De certaines sources, j'ai entendu dire que quelques app ont obtenu rejeté   suivant ce processus. J'ai eu la chance dans mon cas pendant iOS6 donc je suis   montrant le code ici. Utilisez à vos propres risques: - /

Subclassing est la meilleure façon. Créer un drapeau bool pour recevoir une alerte doit rester ou non.

Ceci est la sous-classe UIAlertView

//
//  UICustomAlertView.h
//

#import <UIKit/UIKit.h>

@interface UICustomAlertView : UIAlertView
{

}
@property(nonatomic, assign) BOOL dontDisppear;
@end

//
//  UICustomAlertView.m
//

#import "UICustomAlertView.h"

@implementation UICustomAlertView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {

    if(self.dontDisppear)
        return;
    [super dismissWithClickedButtonIndex:buttonIndex animated:animated];
}
@end

Et voici comment je l'ai utilisé dans mon code

if(![txtUsername.text isEqualToString:@"admin"] && ![txtPassword.text isEqualToString:@"admin"])
{
     alertLogin.dontDisppear = YES;
     alertLogin.message = NSLocalizedString(@"my_alert", nil);
}
else
{
     alertLogin.dontDisppear = NO;
     // proceed
}
#import "MLAlertView.h"

@implementation MLAlertView


-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {
}

-(void)dismissNow:(NSInteger)buttonIndex  {
     [super dismissWithClickedButtonIndex:buttonIndex animated:YES];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top