2010-08-10 44 views
1

有没有办法知道一个视图控制器是-viewWillAppear-viewWillDisappear之间的视图控制器生命周期的某个地方?知道何时-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]; 

有没有一种简单的方法来做到这一点?

+0

大卫,你为什么要使用一个计时器来选择注释,而不是立即选择呢? – Itay 2010-08-10 23:59:19

+0

因为注释是动画化他们的下降,意味着如果一个人立即选择一个注释,它的召唤是可见的,因为它落在地图上。看起来有点奇怪,恕我直言! – 2010-08-11 06:06:24

+0

我同意。你可以在'mapView:didAddAnnotationViews:'中做选择 - 只需设置一个布尔值来表示它需要选择第一个布尔值,然后一旦添加它们就会被选中。 (我有类似的问题) – Itay 2010-08-11 18:23:49

回答

1

自己的方式似乎是最简单的方法,如果不是最强大的。 (简单地检查该视图的实例是否存在似乎是正确的方法(如果它还没有被处理))。

我也实在不明白这样做的目的,除非你有运行,涉及到视图控制器被发现,你正在使用的布尔方法的另一个视图控制器。在那种情况下,它的设计问题比保养问题更多。

+0

我可以理解,我描述的这种方式可能会导致任何人相信我有严重的设计问题。基本上,我有一个MKMapView,它使用NSTimer在第二秒后自动选择第一个注释。问题在于,很多事情可能在第二时间发生,包括从屏幕上删除或完全释放的视图。不幸的是,当视图消失时在NSTimer上调用'invalidate'不够健壮,因为NSTimer偶尔会在一秒之前触发,导致'消息被发送到释放的实例'。 – 2010-08-10 22:21:02

+0

啊我看到了,好像你已经用尽了其他的可能性,你的方式似乎是一个很好的解决方案。 – 2010-08-10 22:22:09

0

使用viewDidDisappear

- (void)viewDidDisappear:(BOOL)animated { 
    // Do stuff that has to be done when this view is off screen. 
} 
+0

恐怕我可能一直不清楚。当视图不在屏幕上时,我不想做任何事情,当屏幕上显示视图或不想从屏幕上移除视图时,我想做些事情。出于这个原因,我设置'isOnScreen'当视图控制器会出现真正的(在'doSomething'方法是好的,被称为),并将其设置错误时,视图控制器会消失(该方法不能再被称为直到视图即将重新出现)。 – 2010-08-10 21:54:29

相关问题