如何确定从iOS中的背景返回到前台加载哪个视图?

我有一个应用程序有多个视图。 当我从背景中回到前景时,我想确定我目前在哪个视图。 我该怎么做?

[编辑]

我明白navigationController的visibleViewController属性可能会有所帮助。 但是,我想知道如何在UIViewController对象中使用它返回的指针。 我们如何比较指针? 一些代码片段会非常有帮助。

取决于你使用的是什么根视图控制器。 如果您有导航控制器,则可以检查visibleViewController属性,以查看哪个视图控制器当前位于导航堆栈的顶部。 对于标签栏控制器,请检查selectedViewController属性以查看哪个标签处于活动状态。 如果是两者的组合,则同时使用两种方法。

每个容器视图控制器都提供了某种方式来确定屏幕上select或当前正在显示的内容。 如果你正在做自己特殊的设置,你将不得不想出一个很好的方法来确定你自己的信息。

zirinisp的答案Swift:

 extension UIWindow { func visibleViewController() -> UIViewController? { if let rootViewController: UIViewController = self.rootViewController { return UIWindow.getVisibleViewControllerFrom(rootViewController) } return nil } class func getVisibleViewControllerFrom(vc:UIViewController) -> UIViewController { if vc.isKindOfClass(UINavigationController.self) { let navigationController = vc as UINavigationController return UIWindow.getVisibleViewControllerFrom( navigationController.visibleViewController) } else if vc.isKindOfClass(UITabBarController.self) { let tabBarController = vc as UITabBarController return UIWindow.getVisibleViewControllerFrom(tabBarController.selectedViewController!) } else { if let presentedViewController = vc.presentedViewController { return UIWindow.getVisibleViewControllerFrom(presentedViewController) } else { return vc; } } } 

用法:

 if let topController = window.visibleViewController() { println(topController) } 

你想知道你的应用程序何时进入前台并变得活跃。 这需要位于视图控制器层次结构的根目录 – 可能是您的AppDelegate,可能是您的根视图控制器。

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

在appActive:(NSNotification *)通知; 或者你所说的任何方法 – 按LucasTizma的build议。

还记得清理完成后的通知

  [[NSNotificationCenter defaultCenter] removeObserver:self]; 

我总是喜欢涉及类别的解决scheme,因为它们是可以重复使用的。

所以我在UIWindow上创build了一个类。 你现在可以在UIWindow上调用visibleViewController,这将通过search控制器层次结构来获得可见的视图控制器。 如果您正在使用导航和/或标签栏控制器,这将起作用。 如果你有其他types的控制器build议请让我知道,我可以添加它。

UIWindow + PazLabs.h(头文件)

 #import <UIKit/UIKit.h> @interface UIWindow (PazLabs) - (UIViewController *) visibleViewController; @end 

UIWindow + PazLabs.m(实现文件)

 #import "UIWindow+PazLabs.h" @implementation UIWindow (PazLabs) - (UIViewController *)visibleViewController { UIViewController *rootViewController = self.rootViewController; return [UIWindow getVisibleViewControllerFrom:rootViewController]; } + (UIViewController *) getVisibleViewControllerFrom:(UIViewController *) vc { if ([vc isKindOfClass:[UINavigationController class]]) { return [UIWindow getVisibleViewControllerFrom:[((UINavigationController *) vc) visibleViewController]]; } else if ([vc isKindOfClass:[UITabBarController class]]) { return [UIWindow getVisibleViewControllerFrom:[((UITabBarController *) vc) selectedViewController]]; } else { if (vc.presentedViewController) { return [UIWindow getVisibleViewControllerFrom:vc.presentedViewController]; } else { return vc; } } } @end