将所有 UIAlertView 对象作为全局对象访问以对其进行通用控制(在解除分配视图控制器后解决警报中的 CRASH)
Posted
技术标签:
【中文标题】将所有 UIAlertView 对象作为全局对象访问以对其进行通用控制(在解除分配视图控制器后解决警报中的 CRASH)【英文标题】:Access all UIAlertView object as a global object to control it Universally(to resolve CRASH in alert after deallocating the view contoller) 【发布时间】:2014-05-07 15:19:43 【问题描述】:我的要求是让我的应用程序的第三个选项卡作为主屏幕,并且每当用户在后台移动应用程序并再次将应用程序移动到前台时,它应该是主屏幕作为我们的第三个选项卡,而不是应用程序在应用程序中的任何地方。 已处理此问题(将第三个选项卡设为主屏幕,而不是应用程序位于应用程序中的任何位置/场景中)。,但我现在有一个由此分辨率生成的问题。
问题:- 如果在任何视图中显示任何警报并且我们正在使应用程序成为背景-前景,则应用程序会从该屏幕转到第三个选项卡,并且警报仍然存在,如果我们点击警报按钮,然后根据ios的规则警报屏幕的“自我”对象被释放(因为现在我们在主屏幕并且警报在这里)并且应用程序崩溃!
尝试了一些解决方案:-
1.在屏幕中,我创建了一个 UIAlertView 的全局对象,并在屏幕的 applicationDidBecomeActive 方法中使用下面的代码行...
[_alertToRemoveContactdismissWithClickedButtonIndex:1 动画:NO];
这是此视图的工作代码,但我的解决问题是我需要在应用程序的所有位置创建警报视图的全局对象,这是一项非常耗时的任务,因为我我在项目中使用了大约 250 个警报。
2.每当应用程序移动到后台时,我都会将其杀死,在此解决方案中,问题是我的应用程序无法在后台运行其下载功能,因为该应用程序是被杀。
如果有人需要更多解释,需要帮助解决这个问题,请离开cmets。
我的崩溃日志.... * -[ContactShowViewController respondsToSelector:]:消息发送到已释放实例 0x1138c4e0*
*ContactShowViewController 与屏幕不同的地方 提前谢谢!!!
【问题讨论】:
这个问题需要代码。在你粘贴太多之前,我建议制作一个基于选项卡的小型应用程序,其中包含 2-3 个选项卡,其视图控制器除了在按下按钮时打开 UIAlertView 之外什么都不做。使崩溃发生并发布该代码+崩溃日志。奖励:制作小应用程序可能会让您找出答案。 @danh 谢谢!为了回复我的帖子,我已经用 CRASH 日志更新了我的帖子,问题不在于任何现有代码,而是警报“自我”对象释放的问题。当我改变对应用程序的看法时前景和具有上述场景的警报对象被释放。 据我所知,基本上你的问题在于呈现 uialertview 的视图控制器,它被释放了,"。如何让它保持活动/未释放?? @Alok 这是问题... 我建议您对显示警报视图的视图控制器具有强大的属性,因为 ARC 会释放弱指向的对象。 【参考方案1】:让我们试试单例:
__strong static AlertUtil* _sharedInstance = nil;
@implementation AlertUtil
UIAlertView *alertView;
+ (AlertUtil *)sharedInstance
@synchronized(self)
if (nil == _sharedInstance)
_sharedInstance = [[AlertUtil alloc] init];
return _sharedInstance;
- (void)showConfirmAlertWithMessage:(NSString *)msg cancelBtnTitle:(NSString *)btn1 okbtnTitle:(NSString *)btn2 delegate:(id)delegate tag:(int)tag
alertView = [[UIAlertView alloc] initWithTitle:nil message:msg delegate:delegate cancelButtonTitle:btn1 otherButtonTitles:btn2, nil];
alertView.tag = tag;
[alertView show];
- (void)cancel
if (alertView)
[alertView dismissWithClickedButtonIndex:0 animated:NO];
【讨论】:
【参考方案2】:我已经在以下解决方案的帮助下解决了这个问题:-
1.我创建了一个 UIAlertView 的应用委托实例。
2.我实现了一个警报视图委托方法“将呈现警报视图...”,该方法将所有警报视图对象作为参数提供给我已将其分配给我的警报视图的应用程序委托对象.
3.关于应用程序生命周期方法“applicationDidEnterBackground”,我正在使用下面的代码...,它退出了我从后台到前台的警报 dailog...
if ([AppDelegate shared].alertObserver)
//Dismissing alert which was shown before moving to background
[[AppDelegate shared].alertObserver dismissWithClickedButtonIndex:0 animated:NO];
[AppDelegate shared].alertObserver=nil;
【讨论】:
以上是关于将所有 UIAlertView 对象作为全局对象访问以对其进行通用控制(在解除分配视图控制器后解决警报中的 CRASH)的主要内容,如果未能解决你的问题,请参考以下文章