我需要以编程方式解除我正在使用的UIAlertController作为“请稍候”消息。我可以毫无问题地提供警报但是当它解除警报时,50%的时间它会解散,而另外50%的时间它没有,强迫我重新启动应用程序只是为了继续使用它。有任何想法如何以100%的一致性解除警报?
+preinitialize
答案 0 :(得分:1)
我一直在学习如何做到这一点。
因此,无论在何处构建警报控制器,您都需要将操作按钮添加到默认样式的“确定”或取消样式中的“取消”。
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:@"You made a mistake."
message:@"Pray we don't alter the alert further"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okayAction = [UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
[alertController dismissViewControllerAnimated:YES completion:nil];
}];
[alertController addAction:okayAction];
[self presentViewController:alertController animated:YES completion:nil];
还有其他UIAlertActionStyle枚举,例如UIAlertActionStyleCancel,它将在其他动作和UIAlertActionStyleDestructive之间放置一个分隔符空间,这将使字体变为红色,但将与其他UIAlertActions保持一致。
确保按顺序添加:标准操作(好的,打开相机,照片库)然后取消操作。
还有preferredStyle:UIAlertControllerStyleActionSheet,用于为用户设置选项。我用它来显示相机和照片库。
另外,针对您的具体解雇行动。它不起作用的原因是因为你试图在后台线程上解雇它。您应该始终关闭或在前台线程上进行UI更改。这将在未来导致NSException /崩溃。
dispatch_async(dispatch_get_main_queue(), ^{
// dismiss your UIAlertController
});
这是您应该如何使用特定代码执行此操作:
dispatch_async(dispatch_get_main_queue(), ^{
MNSHOW_NETWORK_ACTIVITY(NO);
[self refreshAnnotations:self];
[loadingAlert dismissViewControllerAnimated:YES completion:nil];
});
});
您的代码还有其他问题,您应该向其他人寻求帮助。我只是一名初级开发人员,所以我不确定如何正确地做你想做的事情,但这应该有助于解雇。
您可能需要查看加载轮或烤面包信息,其中会显示“请稍候”或“正在加载”
使用UIAlertController来显示加载消息是相当糟糕的品味。
答案 1 :(得分:0)
您在同一个块中创建/启动/解除所有警报,这意味着在同一个runloop中调用了presentViewController:loadingAlert
和[loadingAlert dismissViewControllerAnimated:
。这就是您获得意外结果的原因。
需要从runloop的不同循环中调用dismiss,因此在单独的*块中调用它是你想要的。您已经使用dispatch_async
在不同的线程中执行操作,dismissViewControllerAnimated:
在离散的单独runloop中执行,因此您的解决方案是将dispatch_async(dispatch_get_main_queue()
调用放在wait()
内以确保其两者都在主线程上调用UI更新,并在一个单独的运行循环中调用它作为它的表示。
答案 2 :(得分:0)
首先,您的网络调用应该发生在presentViewController的完成块中。所以你不要在它出现之前解雇它。 此外,嵌套的dispatch_async似乎已关闭,因为您在mainQue(第13行)内调用了dispatch_get_main_queue(第32行)。如果这是有效的,那么dismiss将需要在dispatch_async块中,以便它实际上会被解雇。
但更重要的是这是对UIAlertController API的误用。这些用于用户输入而不是阻止UI。 您最好实现自己的自定义视图子类。 或使用 MBProgressHUD (https://github.com/jdg/MBProgressHUD)。在那里,您可以使用MBProgressHUDModeIndeterminate或MBProgressHUDModeText来完成您正在尝试的操作。
答案 3 :(得分:-2)
您可以使用dismissWithClickedButtonIndex:animated:但现在已在iOS9中弃用。我会用一个计时器:
// 3 second delay
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(dismissAlert) userInfo:nil repeats:NO];
- (void) dismissAlert {
[loadingAlert dismissWithClickedButtonIndex:0 animated:YES];
}
当然,这不是UIAlertViews的目的。你最好在某处使用加载微调器(UIActivityIndicatorView)。