2014-11-12 12 views
5

Ho questo errore: se tocco entrambi i pulsanti contemporaneamente su un UIAlertView il delegato UIAlertView non verrà chiamato e l'intero schermo si blocca (niente è toccabile, anche se la vista di avviso viene ignorata).Toccando 2 pulsanti contemporaneamente su UIAlertView si blocca l'app

Qualcuno ha già visto questo errore? C'è un modo per limitare UIAlertView toccando solo un pulsante?

- (IBAction)logoutAction:(id)sender { 
     self.logoutAlertView = [[UIAlertView alloc] initWithTitle:@"Logout" 
                   message:@"Are you sure you want to logout?" 
                  delegate:self 
                cancelButtonTitle:@"No" 
                otherButtonTitles:@"Yes", nil]; 
     [self.logoutAlertView show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if ([alertView isEqual:self.logoutAlertView]) { 
     if (buttonIndex == 0) { 
      NSLog(@"cancelled logout"); 
     } else { 
      NSLog(@"user will logout"); 
      [self performLogout]; 
     } 
     self.logoutAlertView.delegate = nil; 
    } 
} 
+0

Quale versione di iOS? – trojanfoe

+0

iOs 8.1 è la versione completa, utilizzando l'ultima XCode – user1028028

+0

E il delegato della segnalazione dell'avviso viene conservato correttamente? – trojanfoe

risposta

2

Sì, è possibile toccare più pulsanti su un UIAlertView ei metodi delegati vengono richiamati per ogni tocco. Tuttavia, questo non dovrebbe "congelare" la tua app. Passa attraverso il codice per trovare il problema.

Per evitare eventi multipli di essere manipolati, impostare la proprietà delegato del UIAlertView a zero dopo l'elaborazione del primo:

- (void)showAlert { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; 
    [alert show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    // Avoid further delegate calls 
    alertView.delegate = nil; 

    // Do something 
    if (buttonIndex == alertView.cancelButtonIndex) { 
    // User cancelled, do something 
    } else { 
    // User tapped OK, do something 
    } 
} 
+1

Questo non sembra funzionare – user1028028

+0

Forse essere più specifico perché ho provato questo prima che l'ho postato. –

+0

vedere il codice aggiunto alla domanda .. – user1028028

1

Usa UIAlertController su iOS 8:

if ([UIAlertController class]) 
{ 
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Logout" message:@"Are you sure you want to logout?" preferredStyle:UIAlertControllerStyleAlert]; 
    [alert addAction:[UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) 
    { 
     NSLog(@"cancelled logout"); 
    }]]; 
    [alert addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) 
    { 
     NSLog(@"user will logout"); 
     [self performLogout]; 
    }]]; 

    [self presentViewController:alert animated:YES completion:nil]; 
} 
else 
{ 
    self.logoutAlertView = [[UIAlertView alloc] initWithTitle:@"Logout" 
                 message:@"Are you sure you want to logout?" 
                delegate:self 
              cancelButtonTitle:@"No" 
              otherButtonTitles:@"Yes", nil]; 
    [self.logoutAlertView show]; 
} 
+0

Non funziona ... visualizza un avviso sul controller, a quel punto il mio controller non è centrato nello schermo (menu hamburger con slide out attivo) quindi l'avviso sarà lontano dal centro, o se utilizzo il controller di sfondo che contiene il menu non verrà mostrato perché l'avviso sarà nascosto dietro la parte superiore del controller più – user1028028

+0

@ user1028028 Quindi dovresti ottenere il controller di root, non il controller di sfondo, nel mio caso era rootViewCotroller = [[[UIApplication sharedApplication] .windows lastObject] rootViewController] – ChikabuZ

+0

Non funzionava, sarebbe centrato ma diversamente da AlertView sarebbe un avviso che viene visualizzato dietro gli altri controller della vista – user1028028

Problemi correlati