获取对当前堆栈上的视图控制器的引用

Posted

技术标签:

【中文标题】获取对当前堆栈上的视图控制器的引用【英文标题】:Get a reference to view controller on current stack 【发布时间】:2013-04-17 16:05:18 【问题描述】:

如何创建一个从一个控制器到另一个控制器的指针,该控制器已经在堆栈中并由 StoryBoard 创建。

例如,我使用方法instantiateViewControllerWithIdentifier 将视图控制器加载到堆栈/屏幕上。

我知道这背后还有另一个控制器,仍然加载称为 InitialViewController(类)。如何获得我知道的控制器的引用/指针。

如果我尝试从 self/navigationController 注销presentingViewController 或presentingViewController,它们会返回null。 NSLog(@"presented: %@",self.navigationController.presentedViewController);

编辑 - 有关应用中视图控制器的更多信息

    已加载初始视图控制器(ECSlidingViewController 的子类)

    取决于用户是否登录

    Welcome View Controller 已加载(这是一个导航堆栈,包括 Welcome/Login/Signup) 已加载 Home View Controller(以 home VC 为根的导航堆栈)

基本上,初始视图控制器有一个 topViewController 属性,该属性设置为 Home(导航堆栈)或 Welcome(导航堆栈)。

初始视图控制器始终在当前显示上(只是从未见过)。

我如何引用它,或创建指向它的指针。例如,如果我在 Login VC 的 imp 文件中,如何在不使用 alloc/init 重新创建的情况下控制/链接到初始视图控制器上的视图?

【问题讨论】:

【参考方案1】:

如果您使用的是 UITabBarController,您可以通过以下方式获取对其子 UIViewControllers 的引用:

[myTabBarController objectAtIndex:index];
NSLog(@"Selected view controller class type: %@, selected index: %d", [myTabBarController selectedViewController], [myTabBarController selectedIndex]);

从零开始的索引方案遵循您设置的选项卡顺序,无论是通过编程还是通过 IB(最左边的选项卡 = 索引 0)。

因为您似乎正在搜索的 UIViewController 引用似乎是 rootViewController(因为您命名它的方式;“InitialViewController”),您也可以在您的 appDelegate 中尝试此操作。这需要 5 秒:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary     *)launchOptions


    NSLog(@"self.window.rootViewController = %@", NSStringFromClass([self.window.rootViewController class]));

    UIViewController *myRootViewController = self.window.rootViewController;


让我知道这是否有效:)

无论您使用的是 UITabBarController 还是 UINavigationController,我确信其中之一就是您的 rootViewController。一旦你得到它的引用,剩下的就很简单了:

InitialViewController* myInitialViewController;

for (UIViewController *vc in [myRootViewController childViewControllers]) 
    if([vc isKindOfClass:[InitialViewController class]])
        //Store this reference in a local/global variable or a property, 
        //or simply perform some logic on the vc pointer if you don't need to store it.
        myInitialViewController = (InitialViewController *)vc; //Example & reminder to cast your reference
    

根据评论中发现的新细节进行编辑:

好的,在你的 topViewController 的 viewDidLoad 或 viewWillAppear 中运行这段代码:

//You have to import this class in order to reference it
#import "MESHomeViewController.h"

//Global variable for storing the reference (you can make this a property if you'd like)
MESHomeViewController *myHomeVC;

int i = 0;
for (UIViewController *vc in [self.slidingViewController childViewControllers]) 
    NSLog(@"Current vc at index %d = %@", i, [vc class]);

    if ([vc isKindOfClass:[MESHomeViewController class]]) 

        NSLog(@"Found MESHomeViewController instance - [[self.slidingViewController childViewControllers] objectAtIndex:%d]", i);
        myHomeVC = vc;
        break;

    
    i++;

看看那里是否有参考资料。如果是,您的控制台将打印出 HomeViewController 的类名。

【讨论】:

我已通过编辑更新了我的问题,该编辑提供了有关我想要实现的目标的更多信息。请告诉我。 好的,我克隆了那个 repo 并加载了示例项目。如果您查看示例项目的故事板,您在哪个 ViewController 中(隐喻地),您想引用哪个?这样回答你的问题会容易得多。 谢谢,这很难解释。假设我的登录 VC 在屏幕上。这意味着在堆栈顺序中它会像这个 InitalViewController(底部),它的 topViewController 属性将是“WelcomeVC”(它是一个导航控制器),然后显示登录视图控制器。如何访问加载的初始视图控制器的视图属性? (来自屏幕上登录视图控制器的 imp 文件) 好的,如果我有什么误解,请更正:您的 InitialViewController 就像示例项目中的 InitialSlidingViewController,只是 ECSlidingViewController 的一个实例。 InitialViewController 的 topViewController 属性设置为 WelcomeVC。这是在屏幕上呈现给用户的第一个视图。用户从 WelcomeVC 导航到 LoginViewController。您是否尝试从 LoginViewController.m 中获取对 WelcomeVC 或其他内容的引用? 我正在尝试从 LoginViewController 获取对 HomeViewController.view 的引用。这样我就可以将 HUD 传递到主视图控制器

以上是关于获取对当前堆栈上的视图控制器的引用的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法找出视图控制器是不是从导航堆栈中弹出?

如何知道堆栈中都有哪些视图(或视图控制器)?

如何从自定义表格视图单元类中获取对表格视图控制器的引用

iOS如何获取对带有segue的storyboard容器中嵌入的视图控制器的引用?

显示一个已经在导航堆栈上的视图控制器

如何展开到导航堆栈上的第一个视图控制器