【问题标题】:Getting Initial View Controller from Storyboard inside the App Delegate从 App Delegate 中的 Storyboard 获取初始视图控制器
【发布时间】:2012-10-28 15:45:14
【问题描述】:

我正在尝试访问故事板的初始视图控制器。它是一个导航控制器,通过序列连接到第二个视图控制器。因此,在我的应用程序完成启动后,我想直接显示通过 segue 连接的 viewController。我用这样的代码试了一下,但它不起作用......

UINavigationController *navController = (UINavigationController*)self.window.rootViewController;
[navController.topViewController performSegueWithIdentifier:@"showLoginScreen" sender:self];

我做错了什么?

4 年后

如果我在 4 年后再次查看我的问题,我真的不知道我真正的问题是什么。

【问题讨论】:

    标签: iphone objective-c ios cocoa uistoryboard


    【解决方案1】:

    确保您已勾选标记

    是初始的 ViewController

    故事板中UINavigationController 的选项

    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UINavigationController * myStoryBoardInitialViewController = [storyboard instantiateInitialViewController];
    

    【讨论】:

    • 好的,谢谢。如果我想获得我的导航控制器的第一个视图控制器? myStoryBoardInitialViewController.topViewController ?
    • topViewController 将为您提供导航堆栈上的 topMost viewController..尝试这个来获取第一个 viewcontroller.. [myStoryBoardInitialViewController.viewControllers objectAtIndex:0];
    • 当我这样做时,我收到以下错误消息:警告:尝试在 上呈现 ,其视图不在窗口层次结构中! :/
    • 代码:UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Storyboard~IPhone" bundle:[NSBundle mainBundle]]; UINavigationController * myStoryboardInitialViewController = [storyboard instantiateInitialViewController]; [[myStoryboardInitialViewController.viewControllers objectAtIndex:0]performSegueWithIdentifier:@"showLoginScreen" sender:self];
    • 我想问一下 instantiateInitialViewController 将再次实例化初始视图控制器还是返回已经存在的当前实例?
    【解决方案2】:

    Sebastian,我不确定您为什么要手动启动初始视图控制器 - 如果您在“新项目”的第二个屏幕上勾选“使用故事板”,我的所有项目(都使用故事板)会自动执行此操作“巫师。

    也许您需要将情节提要场景标记为初始?这可以通过勾选“是初始视图控制器”在场景的属性检查器中完成 - 显然命名。

    然后 - 如果您确实有一个不寻常的设置需要您手动访问场景,您可以使用以下内容:

    UIStoryboard *sb = [UIStoryboard storyboardWithName: "StoryboardName"
                                                 bundle: [NSBundle mainBundle]];
    UIViewController *vc = [sb instantiateInitialViewController];
    

    (注意 - 这里没有代码完成,所以再次检查拼写。)

    或者我的问题完全错了..?快乐的黑客攻击!

    【讨论】:

    • 我正在尝试实现 Facebook Connect。如果我的应用程序启动并且会话仍然不可用,我想显示通过序列连接到我的 initialview 控制器的登录视图......也许这个屏幕截图可以帮助你理解我的问题:imageshack.us/photo/my-images/820/bildschirmfoto20121108u.png
    • Sebastian,您似乎不想显示初始视图控制器,而是通过 segue 连接到第一个视图控制器。 (再次阅读您最初的问题,我可能已经猜到了......)除了instantiateInitialViewController 方法之外,故事板对象上还有一个instantiateViewControllerWithIdentifier 方法。因此,您必须为第二个场景命名,并使用该名称来访问它。
    • 嗯,还是不行。我使用了以下代码UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Storyboard~IPhone" bundle:[NSBundle mainBundle]]; UINavigationController * myStoryboardInitialViewController = [storyboard instantiateViewControllerWithIdentifier:@"MenuViewController"]; [myStoryboardInitialViewController performSegueWithIdentifier:@"showLoginScreen" sender:self];.. 在控制台内我收到此消息 Attempt to present on 其视图不在窗口层次结构中!
    • Sebastian,我不知道您如何命名视图控制器(它们的“标识符”)。 “MenuViewController”是第一行还是第二行?如果是第一个,您可以使用instantiateInitialViewController 更轻松地获得它。如果是第二个,我怀疑,你不需要打电话给performSegueWithIdentifier,只需出示即可。穿越转场意味着从一个场景转到另一个场景,由于您还没有屏幕上的场景,performSegueWithIdentifier 不是您想要的。无论如何,segue 从第一个到第二个,所以我期待在这种情况下会出现不同的错误......嗯。
    • ...(续)我猜你只需要说[vc presentViewController] 而不是performSegue 方法。我不确定,我从来没有手动做过。 Grüße von nobi
    【解决方案3】:

    在我的应用中,我有 tabBar

    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    
    TabBarController *tabBar = [storyBoard instantiateViewControllerWithIdentifier:@"TabBarController"];
    
    _window.rootViewController = tabBar;
    

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多