2010-02-26 8 views
38

Attualmente ho una classe spuntando UIAlertView s qua e là. Attualmente, la stessa classe è il delegato per questi (è logico che lo sia). Sfortunatamente, questi UIAlertView chiameranno gli stessi metodi delegati della classe. Ora, la domanda è: come fai a sapere da quale vista di avviso viene invocato un metodo delegato? Stavo pensando di controllare il titolo della vista di avviso, ma non è così elegante. Qual è il modo più elegante per gestire diversi UIAlertView s?Diverse UIAlertViews per un delegato

risposta

102

Tag i UIAlertView s come questo:

#define kAlertViewOne 1 
#define kAlertViewTwo 2 

UIAlertView *alertView1 = [[UIAlertView alloc] init... 
alertView1.tag = kAlertViewOne; 

UIAlertView *alertView2 = [[UIAlertView alloc] init... 
alertView2.tag = kAlertViewTwo; 

e quindi distinguere tra loro nei metodi delegato di utilizzare questi tag:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if(alertView.tag == kAlertViewOne) { 
     // ... 
    } else if(alertView.tag == kAlertViewTwo) { 
     // ... 
    } 
} 
+3

Ah , simpatico. Anche se userei un interruttore. :) – quano

+1

ovviamente un interruttore funzionerebbe anche, ma non mi è mai piaciuto cambiare. =) –

+0

Ottima risposta. Ma questo mi porta ad un'altra domanda. Perché definisci kAlertViewOne 1 e kAlertViewRwo 2. Non potresti semplicemente usare in alertView.tag = 1 o alertView.tag = 2? È fatto per un motivo? – George

4

Cordiali saluti, se si desidera raggiungere solo iOS 4 utenti (il che è ragionevole now that ~98.5% of clients have at least iOS 4 installed), dovresti essere in grado di usare Blocks per fare una gestione in linea davvero bella di UIAlertViews.

Ecco una domanda StackOverflow spiegarlo:
Block for UIAlertViewDelegate

Ho provato ad utilizzare quadro BlocksKit di Zachary Waldowski per questo. Il suo riferimento a UIAlertView(BlocksKit) API sembrava davvero buono. Tuttavia, ho provato a seguire lo his instructions to import the BlocksKit framework nel mio progetto, ma sfortunatamente non sono riuscito a farlo funzionare.

Quindi, come può suggerire Berk Güder, per il momento ho utilizzato i tag UIAlertView. Ma a un certo punto in futuro cercherò di passare all'utilizzo di Blocks (preferibilmente uno che supporta ARC out of the box)!

+0

Se si utilizza iOS 8+, UIAlertController ha metodi di delega basati su blocchi. –

1

È possibile superare l'intero calvario e impedire l'uso di tag migliorando UIAlertView per utilizzare i callback di blocco. Controlla this blog post Ho scritto sull'argomento.

3

più facile & recente

UIAlertView *alert = [[UIAlertView alloc] init... 
alert.tag = 1; 

UIAlertView *alert = [[UIAlertView alloc] init... 
alert.tag = 2; 



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if(alertView.tag == 1) { 
     // first alert... 
    } else { 
     // sec alert... 
    } 
} 

tutto fatto!

+0

Perfetto, grazie! –

0

Ho sempre pensato che l'utilizzo dei tag fosse un po 'un trucco. Se li usi, imposta almeno alcune costanti definite per i numeri di tag.

Invece, utilizzare le proprietà in questo modo:

Nella sezione di interfaccia:

@property (nonatomic, weak) UIAlertView *overDueAlertView; 
@property (nonatomic, weak) UIAlertView *retryPromptAlertView; 

Creare la visualizzazione degli avvisi:

UIAlertView *alert = [[UIAlertView alloc] init... 
self.overDueAlertView = alert; 
[alert show]; 

metodo delegato:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (alertView == self.overDueAlertView) { 
    // Overdue alert 
    } else if (alertView == self.retryPromptAlertView) { 
    // Retry alert 
    }