2013-09-25 2 views
5

Ho un incidente:UIAlertView rende il crash del programma

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue performTask:] may only be called from the main thread.' 

E non sono riuscito a trovare una soluzione per 2 giorni. Ed ecco il codice:

[alert dismissWithClickedButtonIndex:0 animated:YES]; 
UIAlertView *noTicketAlert = [[UIAlertView alloc] initWithTitle:@"Aradığınız kriterlere uygun bilet bulunamadı!" message:nil delegate:self cancelButtonTitle:@"Tamam" otherButtonTitles: nil]; 
[noTicketAlert show]; 
+0

cura di mostrarci il codice per la vista di avviso? –

+1

Questo dovrebbe essere andato in crash in Xcode 4 e Xcode 3. – trojanfoe

+2

Non credo che il messaggio di errore potrebbe essere molto più esplicito. – trojanfoe

risposta

1

Sì, ho trovato la soluzione e io condividere con voi ragazzi. Ho provato a sovrascrivere la funzione dismissWithClickedButtonIndex e ho inviato un pulsante univocoIndex come 9999 per ciascuno dei miei avvisi. Cioè,

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    [self viewWillDisappear:YES]; 
    if(buttonIndex == 9999) { 
     noTicketAlert = [[UIAlertView alloc] initWithTitle:@"Aradığınız kriterlere uygun bilet bulunamadı!" message:nil delegate:self cancelButtonTitle:@"Tamam" otherButtonTitles: nil]; 
     [noTicketAlert show]; 
    } 
} 

e se voglio visualizzare il noticketAlert, Io chiamo questo metodo come:

[alert dismissWithClickedButtonIndex:9999 animated:YES]; 
0

Se si dispone di un pulsante personalizzato assicurarsi di implementare il metodo delegato:

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView 
{ 
    return YES; 
} 

se questo selettore non viene trovato il programma con arresto ..

8

Ho ricevuto questo errore durante la presentazione di un UIAlertView in genere (nessun elemento di override del pulsante divertente). Risultò che lo stavo presentando due volte in rapida successione. La soluzione nel mio caso era rimuovere la chiamata duplicata errata.

Se è necessario presentare due visualizzazioni di avviso allo stesso tempo e viene visualizzato questo errore, quindi una correzione che funziona (e indirizza il messaggio di errore stesso) è per eseguire il codice sul thread principale:

[[NSOperationQueue mainQueue] addOperationWithBlock:^ 
    { 
    // Your code that presents the alert view(s) 
    }]; 
10

Ho attivato questo errore tentando di visualizzare un avviso da un thread in background. Risolto in questo modo:

dispatch_async(dispatch_get_main_queue(), ^{ 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:... 
    [alertView show]; 
}); 
0

Per chi cerca la risposta Swift 2 a questo problema, mi sono imbattuto in un problema simile e risolto con la soluzione di @ Dave Batton

dispatch_async(dispatch_get_main_queue(), { 
    self.performSegueWithIdentifier("loginSegue", sender: self) 
})