iOS 应用程序在警报视图关闭时崩溃

Posted

技术标签:

【中文标题】iOS 应用程序在警报视图关闭时崩溃【英文标题】:iOS app crashes at alert view dismissal 【发布时间】:2013-08-21 13:57:26 【问题描述】:

我在视图控制器的方法中实例化了一些UIAlertView 有问题。这个UIViewController 是从另一个UIViewController 呈现的,并且在某个点上,我以这种方式从实例方法中显示UIAlertView

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Upload Error", @"")
                                                    message:NSLocalizedString(@"It was not possible to complete the upload, do you want to try again?", @"")
                                                   delegate:self
                                          cancelButtonTitle:NSLocalizedString(@"Cancel", @"")
                                          otherButtonTitles:NSLocalizedString(@"Accept", @""), nil];

[alertView show];

我可以在显示此警报视图之前或同时关闭显示的UIViewController,当显示的视图控制器不再出现在屏幕上时,是什么原因导致显示此类警报视图,因此警报视图显示在顶部呈现视图控制器。然后,当点击警报视图的按钮之一时,应用程序崩溃,我猜是因为它的委托是呈现的视图控制器并且它不存在。我怎样才能避免这种情况?

谢谢!

【问题讨论】:

理想情况下,当您有 OK-Cancel 类型的警报时,代表应该在场。在您的情况下是视图控制器,因为您让用户选择在失败时重试。因此委托需要重新启动操作。 【参考方案1】:

在您呈现的视图控制器即将被关闭之前调用dismissWithClickedButtonIndex:animated: 关闭警报视图,可能在其 viewWillDisappear: 或适当的方法中。或者,如果您希望即使在呈现的视图控制器消失后警报视图仍保留在屏幕上,请将呈现视图控制器的引用传递给呈现的视图控制器并将 alertView 的委托设置给呈现的视图控制器。

【讨论】:

所以,我需要让UIViewController 引用警报视图...或者有没有办法检测视图控制器是否正在显示警报视图即将卸载/消失? 如果您的呈现视图控制器是 vc1,而呈现的视图控制器是 vc2,它显示警报视图,请将 vc1 的引用传递给 vc2。然后将警报视图委托设置为 vc1。 如果用户点击“接受”并更新 v2 的视图,我需要执行一些操作,所以我需要 v2 作为代理,所以我需要在关闭 v2 之前“杀死”警报它正在显示,或者如果正在显示警报,则在关闭之前让 v2 ​​不再是代表,不是吗? 如果您确实想根据点击警报的内容更新 v2,那么如果 v2 被解除,则解除警报可能是有意义的。【参考方案2】:

答案取决于您想要实现的行为。

先查UIAlertView documentation:

delegate:接收者的委托,如果没有委托,则为 nil。

如果您不想根据用户做“特别的事情” 操作,传递 null。 如果您想做“特别的事情”,具体取决于 用户操作创建一个特殊的委托来处理用户操作并保持该操作处于活动状态。

【讨论】:

以上是关于iOS 应用程序在警报视图关闭时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

应用程序关闭时没有崩溃警报

在 IOS 中显示警报时,键盘不会从视图中退出

iOS 13 SceneDelegate 上的 WKWebView 警报崩溃

ios应用程序关闭时Firebase通知点击崩溃

当系统清除内存并关闭 UIViewController 时,iOS 崩溃

关闭键盘后 Xamarin.iOS 中的奇怪崩溃