在XCode 4.6中,如何创建一个全新的iOS应用程序,将选项卡式主应用程序与其中一个选项卡上的导航控制器相结合?
我正在尝试以全新的非故事板(普通的旧nib)样式在选项卡栏控制器中添加导航控制器 我发现这是假设XCode有一个新的项目模板,名为“Tab Bar应用程序”。没有。现在XCode 4.6有了“新的选项卡式应用程序”。当然,苹果以其巨大的智慧决定,我不应该有一个主窗口nib(.xib),而应该让选项卡栏控制器及其页面在app delegate中为我编码,而不是在一个新的用户友好的nib实例化选项卡控制器中。我想这是因为这样更灵活,您可以编写代码来决定用户看到哪些选项卡以及看不到哪些选项卡。如果我打开故事板,那么我想我仍然可以在视觉上做任何事情 我对XCode版本差异的漫长而痛苦的历史深感困惑,这些差异影响了stackoverflow和web上其他地方演示的现有问题的有效性,这些问题引用了不同的iOS版本和不同的XCode版本,并针对XCode和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文件基名称的内容相关的不同选择
我还发现,故事板前的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];