Pergunta

Eu tenho o problema de que o método uialertviewDelegate - (void) alertviewCancel: (uialertview *) alertview não é chamado quando cancelará um alerta com o botão Cancelar.

Estranho é que o método delegado - (void) alertview: (uialertview *) alertview clickedbuttonatindex: (NSInteger) ButtonIndex funciona perfeitamente.

Alguém tem alguma ideia?

desde já, obrigado
Sean

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

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

Eu chamo isso quando um botão é clicado:

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

Solução

O alertViewCancel é usado para quando o sistema descarta sua visualização de alerta, não quando o usuário pressiona o botão "Cancelar". Citação do Apple Docs:

Opcionalmente, você pode implementar o método alertviewCancel: para tomar a ação apropriada quando o sistema cancelar sua exibição de alerta. Se o delegado não implementar esse método, o comportamento padrão será simular o usuário clicando no botão Cancelar e fechar a exibição.

Se você deseja capturar quando o usuário pressionar o botão "Cancelar", use o método ClickEdButtonAtIndex e verifique se o índice corresponde ao índice para o botão Cancelar. Para obter esse uso do índice:

index = alertDone.cancelButtonIndex;

Outras dicas

Você pode lidar com o cancelamento no índice 0 deste delegado:

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

Isso pode ser melhorado de duas maneiras. Primeiro, ele apenas lida com o caso que o usuário realmente clicou em um botão. Ele não lida com a situação que [Myalert demitiu -se clickedbuttonIndex:] é chamado, ou que o alerta é demitido de alguma outra maneira. Segundo, o botão 0 não é necessariamente o botão Cancelar. Em um alerta com dois botões, o esquerdo está no índice 0 e o direito está no índice 1. Se você alterou os títulos para que o botão direito diga "Cancelar", o botão 1 é logicamente o botão cancelar. Em vez de "Willdismiss", você pode implementar "Diddismiss", que será chamado após o desaparecimento da caixa de diálogo e não antes.

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == alertView.cancelButtonIndex)
    {
      //cancel button clicked. Do something here.
    }
    else
    {
      //other button indexes clicked
    }
}   
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top