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
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) {
// ...
}
}
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)!
Se si utilizza iOS 8+, UIAlertController ha metodi di delega basati su blocchi. –
È 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.
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!
Perfetto, grazie! –
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
}
Ah , simpatico. Anche se userei un interruttore. :) – quano
ovviamente un interruttore funzionerebbe anche, ma non mi è mai piaciuto cambiare. =) –
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