如何使用给定的根视图控制器和初始视图控制器实例化情节提要?

Posted

技术标签:

【中文标题】如何使用给定的根视图控制器和初始视图控制器实例化情节提要?【英文标题】:How do I instantiate a storyboard with a given root viewcontroller and initial viewcontroller? 【发布时间】:2014-06-19 11:25:18 【问题描述】:

我的应用程序中有一个带有导航控制器和多个视图的故事板。这会自动将带有后退按钮的导航栏放入任何非根视图的视图中。

但是,有时我会从这个故事板导航到一个单独的笔尖。我想导航回情节提要,但不一定要导航到原始根视图。我目前使用这种方法:

+(void) TransitionOnStoryboard:(NSString*)storyboard to:(NSString*)identifier withViewController:(UIViewController*)viewController

    UIStoryboard *sb = [UIStoryboard storyboardWithName:storyboard bundle:nil];
    UIViewController *vc = [sb instantiateViewControllerWithIdentifier:identifier];
    vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [viewController presentViewController:vc animated:YES completion:NULL];

这显示了我想要的视图,但没有导航栏。如何指定我的导航控制器或根视图,以便应用知道要放入带有后退按钮的导航栏?

谢谢

【问题讨论】:

嗨,为了导航到另一个 nib 文件,您可以模态地呈现该 nib 控制器或将其推送到同一个导航控制器。在任何这种情况下,如果您只是弹出(在推送的情况下)或关闭 nib 控制器(在模态的情况下),您将返回到呈现的控制器。如果这不是您需要的,请提供更多规范 为什么不将实例化的 VC 推送到导航堆栈,而不是显示模式!你应该改用[viewController.navigationController pushViewController:vc animated:YES] 我觉得这个没有欲望效果 【参考方案1】:

答案是将导航控制器留在从 nib 添加的视图控制器下方。

将笔尖呈现为全屏模式。如果您的导航栏可以根据需要摆脱。从新的视图控制器中,您可以推送更多模式、添加导航控制器等。

请注意,您可以完成所有这些操作,并且也可以留在故事板中。

完成后,关闭模式以显示您的导航控制器,然后您就可以重新开始使用故事板了。您可以在没有动画的情况下将新的视图控制器推送到导航控制器上,当您弹出来自 nib 的模式时,它应该显示为最前面的 VC。

【讨论】:

您好,感谢您的帮助。所以,我不想摆脱我的导航栏;更重要的是,当我重新启动情节提要时,我不想失去它。如何启动/关闭新的视图控制器,使其按您所说的那样运行? 要么将其显示为模态,然后在完成后将其关闭,要么将其推送到导航堆栈(如果需要,隐藏导航栏),然后在您完成时将其从堆栈中弹出完毕。在任何一种情况下,导航堆栈都保留在来自 nib 的新 VC 下。【参考方案2】:

我确信这不是解决这个问题的理想方法,但它对我来说确实很有效。

本质上,我从视图控制器中删除了自从我离开故事板后生成的所有视图,但在当前视图之前并弹出当前视图。在这种情况下,这些视图属于一个类(CheckboxListViewController),因此可以很简单地删除,如下所示:

+(void) navigateToMainMenu:(UINavigationController*)navigationController

    [QuickView removeFromNavigationController:navigationController allOfViewControllerWithClass:[CheckboxListViewController class]];
    [navigationController popViewControllerAnimated:YES];


+(void) removeFromNavigationController:(UINavigationController *)navigationController allOfViewControllerWithClass:(Class)viewControllerClass

    NSMutableArray *keptViewControllers = [[NSMutableArray alloc]init];
    for (UIViewController *viewController in navigationController.viewControllers)
        if (![viewController isKindOfClass:viewControllerClass])
            [keptViewControllers addObject:viewController];
    navigationController.viewControllers = keptViewControllers;

(注意 - QuickView 是包含这些方法的类的名称。)。

您不希望 pop 导航回的任何其他类可以通过调用来删除:

[QuickView removeFromNavigationController:navigationController allOfViewControllerWithClass:[YourClassName class]];

在 navigateToMenu 方法中。

【讨论】:

你是对的,这不是理想的解决方案,因为它依赖于 UIViewController 是给定的种类。邓肯的解决方案是正确的方法。坦率地说,您只需要维护添加到 Navigation Stack 和 popViewControllerAnimated 的 viewControllers 的计数:适当的次数。比尝试维护自己的导航堆栈要简单得多。

以上是关于如何使用给定的根视图控制器和初始视图控制器实例化情节提要?的主要内容,如果未能解决你的问题,请参考以下文章

故事板中视图控制器之间的共享实例

如何更改导航控制器的根控制器出现在屏幕上的方式?

如何在没有情节提要的情况下以编程方式实例化视图控制器

更改 iOS 窗口的根视图控制器

如何在另一个视图中使用已经初始化的类?

如何从 UIApplicationDelegate 实例“重新启动”iOS 应用程序/重新实例化初始视图控制器?