在XCode 4.6中,如何创建一个全新的iOS应用程序,将选项卡式主应用程序与其中一个选项卡上的导航控制器相结合?

在XCode 4.6中,如何创建一个全新的iOS应用程序,将选项卡式主应用程序与其中一个选项卡上的导航控制器相结合?,ios,xcode,uinavigationcontroller,uitabbarcontroller,xcode4.6,Ios,Xcode,Uinavigationcontroller,Uitabbarcontroller,Xcode4.6,我正在尝试以全新的非故事板(普通的旧nib)样式在选项卡栏控制器中添加导航控制器 我发现这是假设XCode有一个新的项目模板,名为“Tab Bar应用程序”。没有。现在XCode 4.6有了“新的选项卡式应用程序”。当然,苹果以其巨大的智慧决定,我不应该有一个主窗口nib(.xib),而应该让选项卡栏控制器及其页面在app delegate中为我编码,而不是在一个新的用户友好的nib实例化选项卡控制器中。我想这是因为这样更灵活,您可以编写代码来决定用户看到哪些选项卡以及看不到哪些选项卡。如果我打

我正在尝试以全新的非故事板(普通的旧nib)样式在选项卡栏控制器中添加导航控制器

我发现这是假设XCode有一个新的项目模板,名为“Tab Bar应用程序”。没有。现在XCode 4.6有了“新的选项卡式应用程序”。当然,苹果以其巨大的智慧决定,我不应该有一个主窗口nib(.xib),而应该让选项卡栏控制器及其页面在app delegate中为我编码,而不是在一个新的用户友好的nib实例化选项卡控制器中。我想这是因为这样更灵活,您可以编写代码来决定用户看到哪些选项卡以及看不到哪些选项卡。如果我打开故事板,那么我想我仍然可以在视觉上做任何事情

我对XCode版本差异的漫长而痛苦的历史深感困惑,这些差异影响了stackoverflow和web上其他地方演示的现有问题的有效性,这些问题引用了不同的iOS版本和不同的XCode版本,并针对XCode和iOS的版本做出了假设,这些版本现在似乎已经发生了变化,每个都依赖于与设置或未设置的
主Nib文件基名称的内容相关的不同选择

我还发现,故事板前的NIB和组合各种UIKit小部件和控制器的复杂性似乎是创建故事板的主要动机

我在一个真正的基于非故事板nib的应用程序中工作,该应用程序似乎是在苹果改变主意之前创建的。我可以看到,在启动时,nib实例化会自动创建许多不必要的视图,然后将其删除,以便在选项卡栏控制器上动态隐藏和显示选项卡。苹果公司似乎已经考虑了很多,他们通过改变在XCode中生成新应用程序的方式,隐式地改变了推荐的做法。我不是在质疑他们的智慧,事实上我很欣赏这种改变,但它让我迷失和困惑

无论如何,我只是想在主选项卡栏的选项卡中放置一个导航控制器,我已经有了一个应用程序,它一定是在XCode用于生成主窗口并生成带有顶级视图的“选项卡栏应用程序”时启动的,该视图是一个选项卡式视图,并且选项卡栏控制器是nib实例化的。上面的演示也假设了同样的情况

苹果显然从未提供过这种标签栏加导航控制器的明显组合的演示。至少有人告诉我。苹果的人机界面指南显然指出(或曾经指出?)在标签栏中放置导航控制器比在标签栏中放置导航控制器更好,我的问题应该被理解为希望遵守HIG,但无论如何可能,因此我相信我问的是推荐的组合,而不是不推荐的组合

以下是我迄今为止所尝试的:

  • 从大约2009年开始,人们一直试图遵循这一原则,认为旧版本的XCode不再适用

  • 从XCode为我生成的一个新的选项卡式应用程序开始,在故事板关闭的情况下,我有一个它为我生成的根app delegate.m文件,它显然是在应用程序启动时创建的,一个完全用代码编写的选项卡栏控制器对象,并且没有主窗口nib。以下代码完全由Apple编写,我想知道(作为一名相对较新的Cocoa开发人员),如果我想将其中一个选项卡更改为具有导航栏及其关联的UINavigationViewController,我应该在哪里突破并放置我的新东西:

  • --这个标记有助于stackoverflow被破坏的降价系统不被混淆--

    现在看来,过去不需要编写代码就可以完成的事情(根据我链接到的博客上2009年的例子)现在完全是在代码中完成的。我已经阅读了大约500页的“编程iOS 5”,在我的第一个应用程序上工作了几百个小时,并尝试了很多演示应用程序,但我仍然是一个相对不成熟的Cocoa/iOS开发人员,我相信我对这一切的困惑部分在于“控制器和视图”模式,以及它在代码和NIB中组合它们的规则,我不完全清楚

    --

    更新:您可以使用codez

    截图:

    如果您不介意启动一个新应用程序来启动基本功能,请尝试以下方法:

    创建一个选项卡式应用程序(或现在的任何名称):

    然后选择要嵌入到NavigationController中的视图

    然后在NavigationController中转到编辑器->嵌入->如下所示:

    您的结果将如下所示:


    干杯

    当我做同样的事情时,我和你一样困惑,但一旦你理解了结构,你就会发现它非常简单

    基本上,您希望使用要首先显示的RootViewController创建UINavigationController:

    [UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:theViewControllerYouWantToDisplayFirst];
    
    然后只需将此控制器添加到选项卡按钮的数组中

    NSArray *tabs = [[NSArray alloc] 
                            initWithObjects: navController, otherTab, etc];
    
    然后,使用这样的数组设置选项卡

    UITabBarController *rootController = [[UITabBarController alloc] init];
    [rootController setViewControllers:tabs];
    
    并将其添加到选项卡控制器的窗口中:

    [self.window setRootViewController:rootController];
    

    就这样。我花了一些时间才意识到事情的结构。选项卡视图控制器只包含一组视图控制器,您只需将其中一个视图控制器设置为NavigationController

    正如前两个答案中所解释的(都是正确的),我添加了另一个方法来返回到原始的“选项卡式应用程序”模板(可能是XCode的第3版?我不记得了)。 在这个模板中,您将有一个主xib文件,其中包含您的TabBarController

    必须从空的应用程序模板开始,然后执行以下步骤:

    • 添加新文件、用户界面、应用程序Xib。在本教程中,我将
      [self.window setRootViewController:rootController];
      
      @property (strong, nonatomic) IBOutlet UIWindow *window;
      
       - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
          // delete all and leave only the return
          return YES;
      }
      
      return UIApplicationMain(argc, argv, nil, nil);
      
          self.tabBarController.viewControllers = @[viewController1, viewController2];
      
       self.tabBarController.viewControllers = [NSArray arrayWithObjects:navigation ,
           viewController1 ,viewController2, viewController3, viewController4,  nil];