UIAlertview 没有正确关闭?

Posted

技术标签:

【中文标题】UIAlertview 没有正确关闭?【英文标题】:UIAlertview not closing properly? 【发布时间】:2013-08-02 06:11:32 【问题描述】:

我正在使用UIAlertviewviewdidload() 中的那个活动指示器。但我尝试在延迟后将其从超级视图中删除,但在使用以下代码删除UIAlertview 后,我无法在应用程序中执行任何操作.就像一个新的透明层仍在我的视野上方运行。

代码

 -(void)startAlertActivity
    
        _alertView = [[UIAlertView alloc] initWithTitle:@"Loading "
                                                message:@"\n"
                                               delegate:self
                                      cancelButtonTitle:nil
                                      otherButtonTitles:nil];

        spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

        spinner.center = CGPointMake(139.5, 75.5); // .5 so it doesn't blur
        [_alertView addSubview:spinner];

        [spinner startAnimating];
        [_alertView show];
        [_alertView performSelector:@selector(stopAlertActivity) withObject:self afterDelay:5.0];


    

    -(void)stopAlertActivity
      [spinner stopAnimating];
        [_alertView dismissWithClickedButtonIndex:0 animated:YES];
    

ITS 看起来像一个仍在屏幕上运行的透明层,我该如何关闭它?

示例图片....

对我来说,警报现在不在屏幕上,但背景是浅蓝色的

崩溃报告

[UIAlertView stopAlertActivity]: unrecognized selector sent to instance 0x9ab5eb0
2013-08-02 12:20:43.822 AssamKart[5719:12203] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIAlertView stopAlertActivity]: unrecognized selector sent to instance 0x9ab5eb0'
*** First throw call stack:

【问题讨论】:

您是否使用任何第三方控件? nop.iam 仅使用 alertview 和 indicator 问题在于[_alertView performSelector:@selector(stopAlertActivity) withObject:self afterDelay:5.0]; 将其更改为:[self performSelector:@selector(stopAlertActivity) withObject:self afterDelay:5.0]; 【参考方案1】:

你真的应该使用 dispatch_after

_alertView = [[UIAlertView alloc] initWithTitle:@"Loading "
                                        message:@"\n"
                                       delegate:self
                              cancelButtonTitle:nil
                              otherButtonTitles:nil];

spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

spinner.center = CGPointMake(139.5, 75.5); // .5 so it doesn't blur
[_alertView addSubview:spinner];

[spinner startAnimating];
[_alertView show];



double delayInSeconds = 5.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
    [spinner stopAnimating];
    [_alertView dismissWithClickedButtonIndex:0 animated:YES];
);

【讨论】:

【参考方案2】:

你需要改变这一行:

[_alertView performSelector:@selector(stopAlertActivity) withObject:self afterDelay:5.0];

到:

[self performSelector:@selector(stopAlertActivity) withObject:nil afterDelay:5.0];

stopAlertActivity 方法是self 的方法,而不是警报视图。而且您不能将对象传递给选择器,因为stopAlertActivity 不带任何参数。

【讨论】:

不可能。你有没有像我一样把_alertView改成self【参考方案3】:

您不能通过将 alertView 从其 superView 中删除来解除它。相反,您必须致电dismissWithClickedButtonIndex:animated:。这是正确关闭它的唯一方法,请参阅docs。 在您的情况下,我将定义一个以alertView 为参数的方法来执行dismissWithClickedButtonIndex:animated:,并在延迟后执行此方法。

【讨论】:

【参考方案4】:

您应该关闭警报视图,而不是从超级视图中删除,因为它附加到半透明背景。延迟后拨打stopAlertActivity

【讨论】:

但我试图用延迟 5.0 调用另一个方法,并且在那个新方法内部我试图在那个时候关闭它的崩溃 你不应该打电话给alerview,而应该打电话给自己。您需要调用的方法没有在 UIAlertView 中声明,而是在显示它的类中

以上是关于UIAlertview 没有正确关闭?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中以编程方式正确关闭 UIAlertView?

UIAlertView 和 UIAlertController

UIAlertView 无法正常工作

iOS5:有人设法用三个按钮和文本字段(UIAlertViewStylePlainTextInput)修复 UIAlertView 吗?

没有按钮的 UIAlertView 以及如何关闭它

uialertview 多次调用[关闭]