【问题标题】:Sharing the Same UIViewController as the rootViewController with Two UINavigationControllers与两个 UINavigationController 共享与 rootViewController 相同的 UIViewController
【发布时间】:2012-03-31 10:14:15
【问题描述】:

更新:我决定用不同的方式解决我的问题。 我没有尝试直接重用相同的 UIViewController,而是使用了两个设置为 rootViewControllers 的普通 UIViewControllers。在他们的 loadView 方法中,他们调用[storyboard instantiateViewControllerWithIdentifier:] 来获取前一个 UIViewController 并将他们的视图设置为控制器的视图。无论如何,这可能是首选方法,因为我需要设置几个变量和委托。

我有一个 UIStoryBoard,其中有一个 UITabBarController 作为与两个 UINavigationControllers 连接的入口点。它们中的每一个都共享一个共同的 UIViewController 作为它们的根视图控制器。当应用程序启动时,第一个 UITabBarItem 被选中,视图按预期加载。但是,当我选择第二个 UITabBarItem 时,相同的视图不可见。我看到黑色背景的 UINavigationBar。我是否在 Storyboard 界面上做错了什么,还是需要通过每个 UINavigationController 的 方法手动实例化 UIViewController ——例如 loadView?

【问题讨论】:

    标签: ios uiviewcontroller uinavigationcontroller uitabbarcontroller uistoryboard


    【解决方案1】:

    奇怪的是,这是一个没有人问过的问题。据我所知,无法共享 rootViewController,我认为这无疑是一个错误,因为当您检查情节提要上的连接时,您可以看到视图控制器连接到两个导航控制器。我认为这是故事板中的一个缺陷,因为复制 viewController 并重新应用它们的所有连接很容易出错,并使故事板过于复杂。

    我看到了您对问题的解决方案。像这样的解决方法让我怀疑 iOS 中当前的故事板功能是否已准备好创建应用程序。我认为情节提要存在概念问题,Apple 需要确定情节提要上的 viewController 是代表一个实例还是只代表一个类,现在它并不一致,因为您可以看到多个 segues 实际上可以指向相同的 viewController 但实际上每个 segue 都有自己的实例,为什么 rootViewController 连接也不遵循?,我不知道。

    请注意,在您的解决方案中,请考虑 Apple 文档中的以下内容:

    “重要视图控制器是其视图及其创建的任何子视图的唯一所有者。它负责创建这些视图并在适当的时间放弃它们的所有权,包括在内存不足的情况下和视图控制器时本身已发布。如果您使用情节提要或 nib 文件来存储视图对象,则每个视图控制器对象会在视图控制器请求时自动获取这些视图的自己的副本。但是,如果您手动创建视图,则应该永远不要对多个视图控制器使用相同的视图对象。”

    http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html

    【讨论】:

    • 我同意这是一个错误!当然,它应该只实例化视图控制器的多个副本。可惜没有。
    【解决方案2】:

    绝对是故事板中的一个错误。另一种方法是为每个UINavigationController 创建基本UIViewControllers,然后在每个基本视图控制器中创建一个指向相同UIViewControllerUIContainerView

    【讨论】:

    • 我同意这是一个错误。
    【解决方案3】:

    我认为最简单的解决方案是在情节提要中为您的导航控制器设置没有根视图控制器,然后对您的导航控制器执行类似的操作:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        UIViewController *topVC = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"myTopVC"];
        [self pushViewController:topVC animated:NO];
    }
    

    最先推送的 VC 成为根。

    【讨论】:

    • 这行得通,对我来说似乎比其他解决方法更干净。遗憾的是,故事板没有更好地支持 VC 重用。
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多