我怎么能以编程方式解雇UIAlertController

时间:2016-01-14 20:34:31

标签: ios objective-c uialertcontroller

我需要以编程方式解除我正在使用的UIAlertController作为“请稍候”消息。我可以毫无问题地提供警报但是当它解除警报时,50%的时间它会解散,而另外50%的时间它没有,强迫我重新启动应用程序只是为了继续使用它。有任何想法如何以100%的一致性解除警报?

+preinitialize

4 个答案:

答案 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的目的。你最好在某处使用加载微调器(UIActivityIndi​​catorView)。