如何确定在iOS中从背景返回前景时加载哪个视图?

时间:2011-09-21 11:21:48

标签: ios view uinavigationcontroller background viewwillappear

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

[编辑]

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

4 个答案:

答案 0 :(得分:3)

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)
        }

答案 1 :(得分:2)

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

每个容器视图控制器都提供某种方式来确定选择或当前在屏幕上的内容。如果您正在进行自己的特殊设置,则必须想出一个很好的方法来自行确定这些信息。

答案 2 :(得分:1)

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

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

在appActive :( NSNotification *)通知;或者你称之为的任何方法 - 做LucasTizma所建议的。

还记得在完成后清理你的通知

 [[NSNotificationCenter defaultCenter] removeObserver:self];

答案 3 :(得分:1)

我总是喜欢涉及类别的解决方案,因为它们可以很容易地重复使用。

所以我在UIWindow上创建了一个类别。您现在可以在UIWindow上调用visibleViewController,这将通过向下搜索控制器层次结构来获得可见的视图控制器。如果您使用导航和/或标签栏控制器,则此方法有效。如果您有其他类型的控制器建议请告诉我,我可以添加它。

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