我在之前的应用中一直使用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
。我不知道为什么会收到这个错误。
任何线索?
答案 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
代替来自主线程的警报。