知道 -viewWillAppear 何时触发但 -viewWillDisappear 尚未触发
Posted
技术标签:
【中文标题】知道 -viewWillAppear 何时触发但 -viewWillDisappear 尚未触发【英文标题】:Knowing when -viewWillAppear triggered but -viewWillDisappear hasn't 【发布时间】:2010-08-10 21:14:44 【问题描述】:有没有办法知道视图控制器在 -viewWillAppear
和 -viewWillDisappear
之间的视图控制器生命周期中的某个位置?
我问是因为我想确定当我的视图不在屏幕上或即将从屏幕上消失时不会触发方法。当视图即将从屏幕上消失时,我无法在运行时明确检查的某些对象可能会或可能不会被释放,因此,与它们交互显然会导致message sent to deallocated instance
错误。
目前,我正在跟踪BOOL
,如下所示:
- (void)viewWillAppear:(BOOL)animated
isOnScreen = YES;
[super viewWillAppear:animated];
- (void)willWillDisappear:(BOOL)animated
isOnScreen = NO;
[super viewWillAppear:animated];
我的方法是这样的:
if (isOnScreen) [self doSomething];
有没有更简单的方法来做到这一点?
【问题讨论】:
大卫,你为什么使用计时器来选择注释而不是立即选择它? 因为注释正在动画它们的下降,这意味着如果一个人立即选择一个注释,它的标注在它下降到地图上时是可见的。看起来有点奇怪,恕我直言! 我同意。您可以在mapView:didAddAnnotationViews:
中进行选择 - 只需设置一个布尔值,表示它需要选择第一个,然后一旦添加它们,它们就会被选中。 (我也有类似的问题)
mapView:didAddAnnotationViews:
正是我开始 NSTimer
的地方。不幸的是,mapView:didAddAnnotationViews:
在动画完成之前触发——大约在三分之一秒之前,根据我的计算。根据文档,mapView:didAddAnnotationViews:
“告诉代理一个或多个注释视图已添加到地图中。”不幸的是,如果您为 drop 设置动画,它不会延迟。
这是一个与我们正在讨论的内容直接相关的 SO 答案:***.com/questions/1256875/…。你会注意到,那个家伙和我一样解决了这个问题。不幸的是,从表面上看,如果地图出现,他的代码就会崩溃,然后很快就会被释放。这正是我试图用上面的代码来防止的。
【参考方案1】:
你的方法似乎是最简单的方法,如果不是最健壮的话。 (简单地检查该视图实例是否存在似乎是正确的方法(如果它还没有被释放))。
我也不太明白这样做的目的,除非您有另一个视图控制器正在运行与显示您正在使用布尔值的视图控制器相关的方法。在这种情况下,与其说是维护问题,不如说是设计问题。
【讨论】:
我可以理解我所描述的这种方式可能会让任何人相信我有严重的设计问题。基本上,我有一个 MKMapView,它使用 NSTimer 在一秒钟后自动选择第一个注释。问题是在那一秒内可能会发生很多事情,包括视图被从屏幕上删除或完全释放。不幸的是,当视图消失时在 NSTimer 上调用invalidate
不够健壮,因为 NSTimer 偶尔会在前一秒触发,导致 message sent to deallocated instance
。
啊,我明白了,看来您已经用尽了其他可能性,而您的方式对我来说似乎是一个很好的解决方案。【参考方案2】:
使用viewDidDisappear
- (void)viewDidDisappear:(BOOL)animated
// Do stuff that has to be done when this view is off screen.
【讨论】:
恐怕我不清楚。当视图不在屏幕上时我不想做任何事情,我想在视图在屏幕上或不打算从屏幕上删除时做一些事情。出于这个原因,当视图控制器出现时我将isOnScreen
设置为true(可以调用doSomething
方法)并在视图控制器消失时将其设置为false(该方法不能再调用,直到视图即将重新出现)。以上是关于知道 -viewWillAppear 何时触发但 -viewWillDisappear 尚未触发的主要内容,如果未能解决你的问题,请参考以下文章
Azure 触发的 Webjob - 检测 webjob 何时停止