UIAlertview 没有正确关闭?
Posted
技术标签:
【中文标题】UIAlertview 没有正确关闭?【英文标题】:UIAlertview not closing properly? 【发布时间】:2013-08-02 06:11:32 【问题描述】:我正在使用UIAlertview
和viewdidload()
中的那个活动指示器。但我尝试在延迟后将其从超级视图中删除,但在使用以下代码删除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
iOS5:有人设法用三个按钮和文本字段(UIAlertViewStylePlainTextInput)修复 UIAlertView 吗?