我正在尝试以全新的非故事板(普通旧笔尖)样式在标签栏控制器中添加导航控制器。
我发现这个演示假定 XCode 有一个名为“Tab Bar Application”的新项目模板。它没有。现在 XCode 4.6 有了“新的选项卡式应用程序”。当然,Apple 以他们的伟大智慧决定我不应该有一个主窗口 nib (.xib),并且应该在应用程序委托中为我编码标签栏控制器及其页面,而不是在一个新的用户友好的 NIB 中实例化选项卡控制器。我想这是因为这种方式更灵活,您可以编写代码来决定用户看到哪些选项卡以及他们看不到哪些选项卡。如果我打开 Storyboards,那么我想我可以在视觉上做所有事情。
我对 XCode 版本差异的长期和折磨历史深感困惑,这影响了关于 stackoverflow 和网络上其他地方的演示的现有问题的有效性,这些问题引用了不同的 iOS 版本和不同的 XCode 版本,并对 XCode 的版本做出了特定的假设和 iOS 现在似乎已经发生了变化,并且每个都依赖于关于Main Nib File Base Name
设置或未设置内容的不同选择。
我还发现,似乎 pre-storyboard-Nibs 以及组合各种 UIKit 小部件和控制器的复杂性一直是创建故事板的主要动机。
我正在一个真正的非故事板基于 nib 的应用程序中工作,该应用程序似乎是在苹果改变主意之前创建的,我可以看到在启动时很多不必要的视图是由 nib-instantiation 自动创建的,然后被删除,为了在标签栏控制器上动态隐藏和显示标签。这似乎在 Apple 考虑了很多,他们通过改变在 XCode 中生成新应用程序的方式隐式地改变了推荐的做法。我不是在质疑他们的智慧,事实上我很欣赏这种变化,但这让我迷失了方向。
无论如何,我只是想将导航控制器放在主选项卡栏中的选项卡中,并且当 XCode 用于生成主窗口并生成“选项卡栏应用程序”时,我已经有一个应用程序必须重新启动一个顶级视图,它是一个选项卡式视图,并且选项卡栏控制器是 nib 实例化的。上面的演示假设了很多。
众所周知,Apple 显然从未提供过标签栏和导航控制器的这种明显组合的演示。或者我被告知。苹果人机界面指南显然声明(或曾经声明?)将导航控制器放在标签栏内比反之更好,我的问题应该被理解为希望尽可能地遵守 HIG,所以我相信我问的是推荐的组合,而不是不鼓励的组合。
这是我到目前为止所尝试的:
试图从大约 2009 年开始关注这篇博客文章,该文章假设旧版本的 XCode 的事情不再真实。
从 XCode 为我生成的新选项卡式应用程序开始,故事板关闭,我有一个它为我生成的根应用程序委托 .m 文件,它显然是在应用程序启动时创建的,一个完全在代码中的选项卡栏控制器对象,以及它没有主窗口笔尖。以下代码完全由 Apple 编写,我想知道(作为一个相对较新的 Cocoa 开发人员)如果我想将其中一个选项卡更改为具有导航栏,我应该在哪里闯入并放置我的新东西及其关联的 UINavigationViewController:
-- 这个标记帮助 stackoverflow 被破坏的 markdown 系统不被混淆 --
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
UIViewController *viewController1, *viewController2;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
viewController1 = [[RPDAFirstViewController alloc] initWithNibName:@"RPDAFirstViewController_iPhone" bundle:nil];
viewController2 = [[RPDASecondViewController alloc] initWithNibName:@"RPDASecondViewController_iPhone" bundle:nil];
} else {
viewController1 = [[RPDAFirstViewController alloc] initWithNibName:@"RPDAFirstViewController_iPad" bundle:nil];
viewController2 = [[RPDASecondViewController alloc] initWithNibName:@"RPDASecondViewController_iPad" bundle:nil];
}
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = @[viewController1, viewController2];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
现在看来,过去无需编写代码就可以实现的事情(根据我链接到的博客上的 2009 年示例)现在完全在代码中完成。我已经阅读了大约 500 页的“iOS 5 编程”,在我的第一个应用程序上工作了几百个小时,并尝试了很多演示应用程序,但我仍然是一个相对没有经验的 Cocoa/iOS 开发人员,我相信我的一部分对这一切的困惑是“控制器和视图”模式,它在代码和 nib 中组合它们的规则对我来说并不完全清楚。
--
更新:您可以拥有 codez!为了帮助像我这样的未来 XCode-cocoa-iOS 菜鸟,我制作了一个完整的演示应用程序并将其发布在 github 上。
截屏: