2010-01-12 7 views
27

Le protocole UIAlertviewDelegate dispose de plusieurs méthodes optionnel.Comprenant:Est-il possible de ne pas rejeter une UIAlertView

- (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 la vue d'alerte à ne pas rejeter automatiquement avec n'importe quel bouton.

Dois-je créer une sous-classe pour accomplir ceci?

Pourquoi le Protocole UIAlertViewDelegate ont:

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

ET

- (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 bref: Je me rends compte à quoi UIAlertView a été conçu. 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.

Répondre

27

Oui. Sous UIAlertView et 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 une méthode

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

à la del Egate qui va le faire contourner -dismissWithClickedButtonIndex:animated:, mais il est non documenté, donc je ne sais pas si cela vous convient.

+0

C'est ce que je fais maintenant. Mais à cause des méthodes de délégué disponibles, il semble que je ne devrais pas avoir à le faire. Oh bien ... –

+0

Il existe une méthode non documentée (non testée), voir la modification. – kennytm

+0

Hmm ... intéressant. Dommage qu'ils se soient attaqués à l'utilisation d'API non documentées. –

3

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

Les applications qui n'ont pas besoin de suivre les animations de UIAlertView peuvent simplement utiliser alertView:clickedButtonAtIndex:. Les docs pour cette méthode indiquent "le récepteur est automatiquement rejeté après que cette méthode est invoquée".

+0

Merci, j'ai raté ce dernier morceau de texte dans les docs. Il semble encore trop cher d'avoir cette méthode supplémentaire, car il est essentiellement le même que willPresentAlertView ... –

+0

@Darren: Merci beaucoup dans ios7 alertView: willDismissWithButtonIndex: cette méthode appelle deux fois. – TamilKing

1

AVERTISSEMENT

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

Le sous-classement est le meilleur moyen. Créer un drapeau bool pour l'alerte devrait rester ou non.

C'est la sous-classe de 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 voilà 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 
} 
+0

J'ai donné un -1, la raison en est que '' La classe UIAlertView est destinée à être utilisée telle quelle et ne supporte pas la sous-classe La hiérarchie de vue pour cette classe est privée et doit ne pas être modifié "' dans https://developer.apple.com/library/ios/documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html alors la mise en œuvre de votre méthode irait à l'encontre du processus de documentation et de révision d'Apple. leur application rejetée. Cela a été le chemin pour quelques années maintenant, donc au moment où vous répondez cela aura été une réponse incorrecte. – Popeye

+0

Peut-être que mon application a été approuvée l'année dernière (iOS 6). –

+0

Désolé mais cela ne veut pas dire que c'est juste. J'ai soumis une application avant que je ne le sache aussi et elle a passé le processus d'examen initial, puis a été rejetée lorsque j'ai soumis une mise à jour. L'équipe de révision Apple est seulement humaine, ils peuvent manquer des choses. Je sais cependant qu'ils sont plus stricts avec iOS 7 cependant. Cependant, mon -1 était purement parce que cette réponse va à l'encontre de la documentation d'Apple et vous ne le prévenez pas. Si vous en avertissez, je retirerai volontiers mon -1 – Popeye

1
#import "MLAlertView.h" 

@implementation MLAlertView 


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

-(void)dismissNow:(NSInteger)buttonIndex { 
    [super dismissWithClickedButtonIndex:buttonIndex animated:YES]; 
} 
2

À mon avis: Il n'y a aucune raison de garder alertView. Même si vous voulez le garder, pensez simplement à le "re-montrer", en gardant une référence, puis appelez [alertView show] ==>AUCUN BESOIN DE SUBCLASSER N'IMPORTE QUOI. Bonnes nouvelles, hein?

+0

Cela fonctionne. Bien qu'il y ait un léger scintillement lorsque vous réaffichez le popup. – RajV