如何在调用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。