UIAlertView кара програмата да се срива

Имам катастрофа:

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

И не можах да намеря решение 2 дни. А ето и кода:

[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];

person user2586173    schedule 25.09.2013    source източник
comment
Искате ли да ни покажете вашия код за изгледа за предупреждения?   -  person Matt S.    schedule 25.09.2013
comment
Това трябваше да се срине в Xcode 4 и Xcode 3.   -  person trojanfoe    schedule 25.09.2013
comment
Не мисля, че съобщението за грешка може да бъде много по-ясно.   -  person trojanfoe    schedule 25.09.2013
comment
това е xcode 5, програмата работи xcode 3 и 4. Опитах се да надстроя приложението си за ios7, но uialertview кара приложението ми да се срива   -  person user2586173    schedule 25.09.2013
comment
Изглежда, че използвате два случая на предупреждение. Можете ли да дадете пълен код?   -  person parilogic    schedule 25.09.2013
comment
да, разбрах го, опитвам се да го поправя. Благодаря ти :)   -  person user2586173    schedule 25.09.2013
comment
Използвам две предупреждения, едното започва първо, ако възникне грешка, отхвърлям първото и показвам второто на потребителя, там кодът ми се срива.   -  person user2586173    schedule 25.09.2013


Отговори (5)


Задействах тази грешка, като се опитах да покажа предупреждение от фонова нишка. Поправено така:

dispatch_async(dispatch_get_main_queue(), ^{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:...
    [alertView show];
});
person Dave Batton    schedule 31.03.2014

Получих тази грешка при нормално представяне на UIAlertView (без забавни неща за замяна на бутони). Оказа се, че го представям два пъти подред. Поправката в моя случай беше да премахна грешното дублирано повикване.

Ако трябва да представите два изгледа на предупреждение почти по едно и също време и получите тази грешка, тогава корекция, която работи (и адресира самото съобщение за грешка), е да изпълните кода в основната нишка:

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

Да, намерих решението и го споделям с вас. Опитах се да отменя функцията dismissWithClickedButtonIndex и изпратих уникални индекси на бутон като 9999 за всеки от моите сигнали. Това е,

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

и ако искам да покажа noticketAlert, извиквам този метод като:

[alert dismissWithClickedButtonIndex:9999 animated:YES];
person user2586173    schedule 25.09.2013

Ако имате персонализиран бутон, уверете се, че сте внедрили метода на делегиране:

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

ако този селектор не бъде намерен, тогава програмата се срива..

person JuJoDi    schedule 07.10.2013

За тези, които търсят отговора на Swift 2 на този проблем, попаднах на подобен проблем и го реших с решението на @Dave Batton

dispatch_async(dispatch_get_main_queue(), {
    self.performSegueWithIdentifier("loginSegue", sender: self)
})
person hocbaseball456    schedule 01.03.2016