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