2010-01-12 17 views
27

Il protocollo UIAlertviewDelegate UIAlertView ha diversi metodi opzionali tra cui:è possibile non respingere un

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

Questo sembrerebbe suggerire che non tutti i clic sui pulsanti in realtà respingere la visualizzazione degli avvisi. Tuttavia, non vedo alcun modo di configurare la vista di avviso per NON respingere automaticamente con qualsiasi pulsante premere.

Devo creare una sottoclasse per realizzare questo?

Perché il protocollo UIAlertViewDelegate avere:

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

E

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

Se non opzionalmente supporta non respinge la vista avviso ad ogni scatto del tasto?

Breve a parte: Mi rendo conto di cosa è stato progettato per UIAlertView. Ma il mio scopo è quello di consentire all'utente di copiare un testo alla scheda di pasta prima le uscite app (che avviene automaticamente quando la visualizzazione degli avvisi è respinto.

risposta

27

Sì. Sottoclasse UIAlertView e quindi sovraccaricare -dismissWithClickedButtonIndex:animated:, ad esempio

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

Ufficiosamente è possibile definire un metodo di

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

al del egate che lo farà bypassare -dismissWithClickedButtonIndex:animated:, ma è non documentato, quindi non so se è adatto a te.

+0

Questo è quello che sto facendo ora. Ma a causa dei metodi delegati disponibili, sembra che non dovrei farlo. Oh bene ... –

+0

C'è un metodo non documentato (non testato), vedi la modifica. – kennytm

+0

Hmm ... interessante. Peccato che si siano limitati a utilizzare API non documentate. –

3

willPresentAlertView:, didPresentAlertView:, alertView:willDismissWithButtonIndex: e alertView:didDismissWithButtonIndex: sono per il monitoraggio l'inizio e la fine delle animazioni di UIAlertView.

Le applicazioni che non hanno bisogno di tracciare le animazioni di UIAlertView possono semplicemente utilizzare alertView:clickedButtonAtIndex:. I documenti per quel metodo dicono "il destinatario viene automaticamente rimosso dopo che questo metodo è stato invocato."

+0

Grazie, ho perso l'ultima porzione di testo nei documenti. Sembra ancora eccessivo avere quel metodo in più, dal momento che è essenzialmente uguale a willPresentAlertView ... –

+0

@Darren: Grazie e molto in ios7 alertView: willDismissWithButtonIndex: questo metodo chiama due volte. ma la tua soluzione salva la mia giornata .. – TamilKing

1

ATTENZIONE

Da alcune fonti Ho sentito dire che alcune app hai rifiutato seguendo questo processo. Sono stato fortunato nel mio caso durante iOS6 quindi sono mostrando il codice qui. Utilizzare a proprio rischio: -/

La sottoclasse è il modo migliore. Creare un flag bool per l'avviso dovrebbe rimanere o meno.

Questa è la sottoclasse di 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 

Ed ecco come l'ho usato nel mio codice

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

Ho dato un -1, il motivo è dovuto a '" La classe UIAlertView è concepita per essere utilizzata così com'è e non supporta la sottoclassi. La gerarchia di visualizzazione per questa classe è privata e deve non essere modificato "' in https://developer.apple.com/library/ios/documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html quindi l'implementazione del tuo modo sarebbe contro il processo di Documentazione e Revisione di Apple la loro app rifiutata. Questo è stato il modo per alcuni anni, quindi al momento di rispondere a questo sarà stata una risposta sbagliata. – Popeye

+0

Forse la mia app è stata approvata l'anno scorso (iOS 6). –

+0

Scusa ma non significa che sia giusto. Ho inviato un'app prima che anch'io ne venissi a conoscenza e durante il processo di revisione iniziale è stata respinta quando ho inviato un aggiornamento. Il team di revisione di Apple è umano solo per poter perdere le cose. So però che sono più severi con iOS 7 però. Tuttavia il mio -1 è stato puramente perché questa risposta va contro la documentazione di Apple e non si avvisa di ciò. Se avverti questo, rimuoverò felicemente il mio -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

A mio parere: Non c'è alcun motivo per tenere alertView. Anche se vuoi mantenerlo, pensa semplicemente a "riprodurlo", mantenendo un riferimento, quindi chiama [alertView show] ==>NESSUNA NECESSITA DI SUBCLASSING NULLA. Buone notizie, eh?

+0

Questo funziona. Anche se c'è un lieve sfarfallio quando si visualizza nuovamente il popup. – RajV

Problemi correlati