2010-12-14 72 views
6

在iOS4.2的/ iPhone4的如何知道在后台显示UIViewController视图的时间?

  • 点击图标启动程序(会显示一些视图 控制器视图)
  • 点击iPhone主页键(返回 主屏幕)
  • 双击Home键
  • 选择此前推出的应用程序从 选择现在

我可以看到我的应用程序委托在最后一步之后被选中时会收到一条消息“applicationDidBecomeActive”,但我的viewController(当前显示的那个人)是如何知道的?

viewDidLoad已被调用,所以不会再次调用。 viewWillLoad不会再被调用。

似乎无法弄清楚。我想问的原因是我想检查是否进行了任何设置更改,但是希望在视图控制器中这样做,因为这是关心的事情。

回答

5
在你

是的appDelegate applicationDidBecomeActive把这个:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    UINavigationController *navc = (UINavigationController *)[tabBarController selectedViewController]; 

    UIViewController *topvc = [navc topViewController]; 

    if ([topvc respondsToSelector:@selector(viewControllerDidBecomeActive)]) 
    { 
     [topvc performSelector:@selector(viewControllerDidBecomeActive)]; 
    } 
} 

这得到正被屏幕上看到的viewController。您只需在每个viewControllers上实现viewControllerDidBecomeActive;)

+0

对,那种作品,但不是我正在寻找的。我的视图层次结构稍微复杂一些,所以你的发布代码不会按原样工作,但我明白了,我可以这样做。所以它绝对是一种方式。我想我希望我错过了一些东西,并且有一种更直接的方式,它独立于任何视图控制器层次结构。 – Fraggle 2010-12-14 20:58:23

+0

现在几年后,但AFAICS最好的选择是使用NSNotificationCenter。 – 2013-10-15 12:18:02

0

在appDelegate applicationDidBecomeActive中设置一个布尔属性,标记它刚刚从后台出现。

然后在你的viewcontroller中,特别是在viewDidAppear覆盖中,检查appDelegate属性,如果它是真的,那么你知道它已经来自背景,否则它就像正常一样出现。顺便说一下,将布尔属性设置为false以保持整洁。

EDIT- 除非重新创建导航堆栈,否则必须在applicationDidBecomeActive中手动调用viewDidAppear。如果你能够获得一个指向当前可见视图控制器的指针,那么调用viewDidAppear应该是一个没有大碍的方法,因为所有的视图控制器都有这个方法。您不需要任何代表或者等

+0

唔,不这样做。这个观点已经出现了。然后有人去改变一些设置,然后他们回到应用程序。无论如何,通常在iOS 4上,viewDidAppear不会再被调用,对吧? – Fraggle 2010-12-15 19:55:32

+0

对不起,您的权利!我在应用程序中忘记了我正在对applicationDidBecomeActive中的导航堆栈进行操作。如果你有一个指向你当前可见视图控制器的指针,那么你可以在你的视图中调用一个函数来告诉它检查是否有任何改变,但这与Thomas的答案基本相同,但没有代表的优雅。 – Rob 2010-12-16 07:04:38

相关问题