UIAlertController在backgroundThread目标C中出现崩溃

时间:2015-11-27 09:47:01

标签: ios objective-c uialertcontroller presentviewcontroller

我在之前的应用中一直使用UIAlertController,但这次我遇到了一个奇怪的错误。这是我用来呈现它的代码:

     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:ALERT_TITLE_STRING message:message preferredStyle:UIAlertControllerStyleAlert];
     [alertController addAction:[UIAlertAction actionWithTitle:OK_STRING style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

     }]];
     [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:alertController animated:YES completion:^{

     }];

一切都很好,但现在我的应用程序在最后一行崩溃了。这是错误:

  

此应用程序正在从后台修改autolayout引擎   线程,这可能导致引擎损坏和奇怪的崩溃。这个   将在未来版本中引发异常。

我在我的应用中没有使用autolayout。我不知道为什么会收到这个错误。

任何线索?

3 个答案:

答案 0 :(得分:9)

当您尝试在后台线程中执行UI任务时,会显示此错误。只需将您的代码更改为:

dispatch_async(dispatch_get_main_queue(), ^{

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:ALERT_TITLE_STRING message:message preferredStyle:UIAlertControllerStyleAlert];
     [alertController addAction:[UIAlertAction actionWithTitle:OK_STRING style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

     }]];


        [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:alertController animated:YES completion:^{
     }];
    });

答案 1 :(得分:5)

您无法在主线程之外的任何其他线程中处理UI。

如果你当前在另一个线程中,你可以强制在主线程上执行一段代码,方法是把它放在下面的块中。

dispatch_async(dispatch_get_main_queue(), ^{
        //Display your UIAlertController here
    });

答案 2 :(得分:2)

您不允许在主线程的任何线程上执行UI操作。警报控制器将在内部使用自动布局,这就是您看到错误的原因。

使用dispatch_async代替来自主线程的警报。