2010-03-15 8 views
8

Ho il problema che il metodo UIAlertViewDelegate - (void) alertViewCancel: (UIAlertView *) alertView non viene chiamato quando posso cancellare un AlertView con la sua pulsante Annulla.- (void) alertViewCancel: (UIAlertView *) alertView non è chiamato

strano è che il metodo delegato - (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex funziona perfettamente.

Qualcuno ha un'idea?

Grazie in anticipo
Sean

- (void)alertViewCancel:(UIAlertView *)alertView 
{ 
    if(![self aBooleanMethod]) 
    { 
     exit(0); 
    } 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    //some code 
} 

Io chiamo questo quando un pulsante viene premuto:

- (void)ImagePickDone 
{ 
    UIAlertView *alertDone = [[UIAlertView alloc] 
          initWithTitle:@"Done" 
          message:@"Are u sure?" 
          delegate:self 
          cancelButtonTitle:@"Cancel" 
          otherButtonTitles: @"Yes", nil]; 
    [alertDone show]; 
    [alertDone release]; 
} 
+1

Possiamo vedere qualche codice? Forse la tua implementazione di '-alertViewCancel', così come gli altri snippet che trattano la tua vista di avviso (come quando la presenti per la prima volta). – Tim

+0

Ok. Scusa, l'ho dimenticato. Ho modificato la mia domanda ora. – Sean

risposta

11

L'alertViewCancel viene utilizzato quando il sistema respinge la visualizzazione avviso, non quando l'utente preme il pulsante "Annulla". Citazione di apple docs:

Opzionalmente, è possibile implementare la alertViewCancel: metodo per prendere la azione appropriata quando il sistema annulla la visualizzazione di allarme. Se il delegato non implementa questo metodo , il comportamento predefinito è simulare l'utente che fa clic sul pulsante Annulla e chiude la visualizzazione.

Se si desidera acquisire quando l'utente preme il pulsante "Annulla", è necessario utilizzare il metodo ClickedButtonAtIndex e verificare che l'indice corrisponda all'indice per il pulsante Annulla. Per ottenere questo uso Indice:

index = alertDone.cancelButtonIndex; 
+0

Grazie mille pheelicks. L'ho letto prima, ma non ho capito che non è per lo scopo che volevo, perché il mio inglese non è così bene. – Sean

+0

Non mi sento male, ho avuto lo stesso equivoco ieri e sono un madrelingua. Ho inviato un feedback che menzionava la formulazione confusa. Se più di noi lo fanno, forse altri non saranno inciampati come eravamo. – willc2

2

è possibile gestire il Annulla l'indice 0 di questo delegato:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0){ 
     //cancel button clicked. Do something here. 
    } 
    else{ 
     //other button indexes clicked 
    } 
} 
0

questo può essere migliorato in due modi. Innanzitutto, gestisce solo il caso in cui l'utente ha effettivamente fatto clic su un pulsante. Non gestisce la situazione in cui [myAlert dismissWithClickedButtonIndex:] viene chiamato, o che l'avviso viene ignorato in qualche altro modo. In secondo luogo, il pulsante 0 non è necessariamente il pulsante Annulla. In un avviso con due pulsanti, quello di sinistra si trova nell'indice 0 e quello di destra è nell'indice 1. Se i titoli sono stati modificati in modo che il pulsante destro pronunci "Annulla", il pulsante 1 è logicamente il pulsante Annulla. Invece di "willDismiss" puoi implementare "didDismiss" che verrà chiamato dopo che la finestra di dialogo è scomparsa e non prima.

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == alertView.cancelButtonIndex) 
    { 
     //cancel button clicked. Do something here. 
    } 
    else 
    { 
     //other button indexes clicked 
    } 
}