2013-09-25 15 views
5

Mam awarię:UIAlertView sprawia programu katastrofę

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

I nie mógł znaleźć rozwiązanie do 2 dni. A oto kod:

[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

Opieka pokazać nam swój kod widok alertu? –

+1

To powinno załamać się w Xcode 4 i Xcode 3. – trojanfoe

+2

Nie sądzę, aby komunikat o błędzie mógł być bardziej wyraźny. – trojanfoe

Odpowiedz

1

Tak, znalazłem rozwiązanie i że dzielę z wami. Próbowałem zastąpić funkcję dismissWithClickedButtonIndex i wysłałem unikalny przyciskIndexy , taki jak 9999 dla każdego z moich alertów. Oznacza to,

- (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]; 
    } 
} 

i jeśli chcę, aby wyświetlić noticketAlert wzywam ta metoda jak:

[alert dismissWithClickedButtonIndex:9999 animated:YES]; 
0

Jeśli masz przycisk niestandardowy upewnij się wdrożyć metodę Delegat:

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

jeśli ten selektor nie zostanie znaleziony, to program z awarią.

8

Wystąpił ten błąd podczas normalnego wyświetlania interfejsu UIAlertView (brak zabawnych elementów zastępujących przyciski). Okazało się, że przedstawiam go dwa razy w krótkich odstępach czasu. Poprawka w moim przypadku polegała na usunięciu błędnego duplikatu połączenia.

Jeśli trzeba wyświetlić dwa wyświetlenia alertów w tym samym czasie, a pojawi się ten błąd, to poprawka, która działa (i odnosi się do samego komunikatu o błędzie), uruchamia kod w głównym wątku:

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

Wystąpił ten błąd, próbując wyświetlić alert z wątku tła. Stała tak:

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

Dla tych, którzy szukają dla Swift 2 odpowiedzi na ten problem, wpadłem na podobny problem i rozwiązać go roztworem @Dave batton za

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