无需引用即可从不同的 UINavigationController 获取顶级 UIViewController

Get top UIViewController from different UINavigationController without reference

我有一个视图层次结构

a) UINavigationController > b) UIViewController > c) UITabbarController > d) UINavigationController

好的,现在在应用程序的任何时候,我都在 b | c | d – 我添加了通知来处理(和检查)用户是否去(或来)background/foreground。

这很好用,但如果用户来到前台 – 我将在不同的(新)UINavigationController 对象中呈现一个 UIViewController(我们将其命名为 'z')。

这也很好用..但是如果我已经在 z 中并且用户进入后台并且出现在前台,我不应该再次显示 z,因为它已经可见,这就是问题所在。

我面临的问题:

如果它来自同一个导航控制器(如 a),我可能会通过它的 属性 topViewController 检测到它。但是在这里我不能?

有什么方法可以在不为其创建引用的情况下完成此操作?

您可以在 window 的根视图控制器上显示控制器(在您的情况下为 zController)并检查它是否已经显示。

在根视图控制器上呈现控制器,

//Use this code to present the zController
    UIViewController *rootViewController =[[[[UIApplication sharedApplication] delegate] window] rootViewController];
    [rootViewController presentViewController:zController animated:YES completion:nil];

当应用程序进入前台时,您可以检查控制器是否已经呈现如下,

- (BOOL)checkIfzControllerIsAlreadyPresented
{
    UIViewController *rootViewController =[[[[UIApplication sharedApplication] delegate] window] rootViewController];
    id obj = rootViewController.presentedViewController;
    if (obj && [obj isKindOfClass:[zController class]]) {
        return YES; //zController is already visble
    }
    return NO;
}