如何在调用applicationDidBecomeActive时告诉活动视图控制器?

我觉得我在这里错过了一招

我只想在applicationDidBecomeActive被调用时调用当前活动视图控制器的viewDidLoad或viewDidAppear,所以当应用程序从后台重新启动时,我可以重置一些animation或其他内容。 我的一些观点不关心,但其他人真的需要知道。

我使用故事板,我的应用程序委托文件具有标准function – 但所有与EMPTY机构。 例如,didFinishLaunchingWithOptions只是返回YES,不做任何事情。 故事板自动完成我所想的一切。

那么我怎么能从我空白的,无信息的应用程序委托中与当前的视图控制器交谈?

我会build议使用通知。

在您的应用程序委托的applicationdidBecomeActive方法放在这个代码:

[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil]; 

在你当前的活动视图控制器的init方法中订阅通知。

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStuff) name:@"appDidBecomeActive" object:nil]; 

在你的控制器中实现“updateStuff”方法,当应用程序变为活动状态时,你应该可以做任何你想做的事情。

操作系统不会从您的应用程序委托发送通知,而是自动发送一个您可以观察到的通知:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(initSongInfo) name:UIApplicationDidBecomeActiveNotification object:nil]; 

当然要确保在你的dealloc方法之前或之内停止观察,通过调用:

 [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil]; 

Swift版本:

你可以在viewDidLoad中添加这一行

 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil) func viewDidBecomeActive(){ print("viewDidBecomeActive") } 

而不是试图跟踪哪个ViewController是最新的,你可以从你的AppDelegate发送一个NSNotification并在你的ViewController中订阅它。这样视图控制器就会跟踪它是否需要调用viewDidAppear。

你的AppDelegate将有一个窗口属性,该窗口将有一个rootViewController属性。 你可以在这里find你的viewController。

如果你正在使用TabBarController,rootviewcontroller将是tabbarcontroller,你可以调用tabbarcontroller的selectedViewController来获取当前的viewController。

 UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; if ([rootViewController isKindOfClass:[UITabBarController Class]]) rootViewController = ((UITabBarController *)rootViewController).selectedViewController; else if ([rootViewController isKindOfClass:[UINavigationController Class]]) rootViewController = ((UINavigationController *)rootViewController).topViewController; [rootViewController viewDidAppear]; 

如果使用导航控制器或模态视图的视图层次结构更复杂,则可以调用presentViewController或topViewController。