Pregunta

Tengo dicho error: al hacer clic navigationbar.backItemButton que estoy mostrando UIAlertView con dos botones. Cuando pulso en cualquiera de ellos termina con la aplicación simplemente EXC_BAD_ACCESS. Método - (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex no llama. ¿Cómo puedo resolverlo? Gracias!

// h - archivo

@interface DetailsTableViewController : UITableViewController <UITextFieldDelegate, UIAlertViewDelegate>

// m - archivo

- (void)viewWillDisappear:(BOOL)animated
{
    //if changes unsaved - alert reask window
    if (isDirty)
    {
        UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Save changes?"  
                                                      message:@"Press YES if you want to save changes before exit, NO - other case."  
                                                     delegate: self  
                                                    cancelButtonTitle: @"NO"  
                                                    otherButtonTitles: @"YES", nil];   

        [message show];  

        [message autorelease];
    }   
}

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex: buttonIndex];  

    if([title isEqualToString: @"YES"])  
    {  
        [self saveBtnUserClick];    
    } 
}
¿Fue útil?

Solución

Creo que el problema es que después de que ha tocado el botón de regreso de su controlador de corriente se retira de la pila de navegación y cancela la asignación, por lo que cuando intentos de alerta para llamar a sus métodos de delegados se les llama en el objeto desasignado que se traduce en errores EXC_BAD_ACCESS. Para solucionar el problema que veo 2 opciones obvias (aunque puede haber mejores soluciones):

  1. retener extra en algún lugar de su controlador (controlador anterior puede ser), pero hay que encontrar el camino para liberarlo cuando haya terminado.
  2. Crear botón personalizado en lugar de "vuelta" estándar y simplemente mostrar alerta cuando se dio un golpecito. A continuación, en el método delegado de alerta pop su controlador de corriente de la pila de navegación.

Otros consejos

Trate de cambiar delegado a cero en lugar de uno mismo. Se fija mi problema.

Es el controlador de vista la aplicación de la UIAlertViewDelegate? Si no fuera así, en el que la interfaz de declaración ante el {aperturas.

Proveedores NSLogging dentro del método clickedButtonAtIndex e imprimir los valores buttonIndex y ver la consola.

Edit: La lectura de su puesto de nuevo, supongo que de hecho ha perdido el UIAlertViewDelegate en su declaración de interfaz

.

Probablemente [autorelease mensaje]; es que el uso error [Liberación mensaje];

Debido a que usted ha utilizado [[UIAlertView alloc] init .....]; allí para usted debe liberar la memoria.

autorelease es algo va a trabajar con la estructura que la memoria es dependiente o compilador no le han dado la memoria manualmente.

Disfruta.

"trate de cambiar delegado a cero en lugar de uno mismo. Se fija mi problema." trabajó para mi. Gracias

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top