Domanda

Al momento ho una classe spuntando UIAlertViews qua e là. Attualmente, la stessa classe è il delegato per questi (è molto logico che sarebbe). Purtroppo, queste UIAlertViews chiameranno gli stessi metodi delegato della classe. Ora, la domanda è - come fai a sapere da cui vista avviso un metodo delegato viene richiamato? Stavo pensando di solo controllando il titolo della vista allerta, ma che non è così elegante. Qual è il modo più elegante per gestire diversi UIAlertViews?

È stato utile?

Soluzione

tag i UIAlertViews 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 utilizzando questi tag:

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

Altri suggerimenti

A proposito, se si desidera raggiungere solo iOS 4 utenti (che è ragionevole ora che ~ 98,5% dei clienti hanno almeno iOS 4 installato ), si dovrebbe essere in grado di utilizzare i blocchi per fare veramente bello movimentazione in linea di UIAlertViews.

Ecco una domanda StackOverflow spiegarlo:
Blocco per UIAlertViewDelegate

Ho provato ad utilizzare quadro BlocksKit di Zachary Waldowski per questo. La sua UIAlertView (BlocksKit) di riferimento API sembrava veramente buono. Tuttavia, ho cercato di seguire sue istruzioni per importare il quadro BlocksKit nel mio progetto, ma purtroppo non riuscivo a farlo funzionare.

Quindi, come suggerisce Can Berk Güder, ho usato i tag UIAlertView per ora. Ma ad un certo punto in futuro ho intenzione di provare a spostare al utilizzando blocchi (preferibilmente uno che supporta ARC out of the box)!

più facile e più 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!

È possibile superare tutto questo calvario e impedirsi di utilizzare i tag migliorando UIAlertView di utilizzare i callback di blocco. Scopri questo post del blog ho scritto su questo argomento.

Ho sempre pensato che utilizzando i tag è un po 'di un hack. Se lo fai usarli, almeno impostare alcune costanti definite per i numeri dei marchi.

Invece, io uso 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
  }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top