情节提要:更改情节提要中指定的 UINavigation 控制器的根视图

Posted

技术标签:

【中文标题】情节提要:更改情节提要中指定的 UINavigation 控制器的根视图【英文标题】:Storyboard: Changing the Root View of a UINavigation Controller Specified in a Storyboard 【发布时间】:2012-03-23 20:10:58 【问题描述】:

我查看了建议的列表,没有发现任何符合我的困境的东西。

我正在编写我的第一个故事板项目。我有一个管理 4 个选项卡的 UITabBarController。每个选项卡都有一个 UINavigationController 作为其根,每个选项卡中都有许多视图。

其中一个导航堆栈实际上是由 3 个视图控制器组成的“环”。我使用自定义 segue 将导航堆栈的通常“堆积”替换为简单的替换(我堆积一个视图)。

这非常有效。故事板和自定义转场正是医生所要求的。

但是,我想让用户选择他们从 3 个视图中的哪一个开始(成为导航堆栈的根)。故事板坚持要我选择其中一个作为根,所以我这样做了。但是,在运行时,用户可能希望初始视图不同,因此我希望导航堆栈具有不同的视图。

在基于 nib 的应用程序中,我只需从 nib 实例化一个新控制器,然后用该控制器替换当前根。

如何挑选一个控制器并在情节提要中执行此操作?

【问题讨论】:

好的。我想我有。这有点迂回,但 UIStoryboard::instantiateViewControllerWithIdentifier 方法是我需要的。我只需要准备好合适的故事板。当我满意时,我会发布代码。 【参考方案1】:

更新: 感谢in another thread 的评论,我能够稍微简化一下。

好的。我想通了。

我没有替换根目录,而是简单地推动适当的控制器。这是因为更改根需要重新实例化控制器,而狐狸根本不值得追逐。这对用户体验的影响为零,所以我们这样做:

/**************************************************************//**
 \brief Selects the initial search screen, depending on the user's choice.
 *****************************************************************/
- (void)selectInitialSearchAndForce:(BOOL)force         ///< If YES, then the screen will be set to the default, even if we were already set to one.

    UITabBarController  *tabController = (UITabBarController *)self.window.rootViewController;

    [tabController setSelectedIndex:0]; // Set the tab bar to the search screens.

    if ( force )
        
        UIStoryboard    *st = [tabController storyboard];

        [[searchNavController navigationController] popToRootViewControllerAnimated:NO];

        UIViewController    *newSearch = nil;

        switch ( [[BMLT_Prefs getBMLT_Prefs] searchTypePref] )
            
            case _PREFER_MAP_SEARCH:
            if ([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPad)   // The map and simple searches are combined, on the iPad.
                
                newSearch = [st instantiateViewControllerWithIdentifier:@"map-search"];
                
            break;

            case _PREFER_ADVANCED_SEARCH:
            newSearch = [st instantiateViewControllerWithIdentifier:@"advanced-search"];
           break;
            

        if ( newSearch )    // We push the controller, as opposed to changing the root, because it's easier, and doesn't violate any of our ground rules.
            
            [[searchNavController navigationController] pushViewController:newSearch animated:NO];
            // In the case of the iPad, we use a standard navbar push, so we need to prime the simple view to properly populate the Advanced view back button.
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
                
                UIViewController    *simpleViewController = [[[searchNavController navigationController] viewControllers] objectAtIndex:0];

                simpleViewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString([[simpleViewController navigationItem] title], nil)
                                                                                                         style:UIBarButtonItemStyleBordered
                                                                                                        target:nil
                                                                                                        action:nil];
                
            
        

【讨论】:

以上是关于情节提要:更改情节提要中指定的 UINavigation 控制器的根视图的主要内容,如果未能解决你的问题,请参考以下文章

如何更改情节提要中 tableHeaderView 的高度?

更改情节提要参考的名称

UIButton 标题标签文本未使用情节提要或以编程方式更改

使用情节提要更改 UITableView 单元格的高度

从情节提要加载 UILabel,无法更改 cellForRowAtIndexPath 中的框架

在情节提要中更改 UIButton BorderColor