2

我正在尝试以全新的非故事板(普通旧笔尖)样式在标签栏控制器中添加导航控制器。

我发现这个演示假定 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,所以我相信我问的是推荐的组合,而不是不鼓励的组合。

这是我到目前为止所尝试的:

  1. 试图从大约 2009 年开始关注这篇博客文章,该文章假设旧版本的 XCode 的事情不再真实。

  2. 从 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 上。

截屏: 在此处输入图像描述

4

4 回答 4

4

当我做同样的事情时,我和你一样困惑,但是一旦你理解了这个结构,你会发现它很简单。

基本上,您想使用要首先显示的 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];

就是这样。我花了一些时间来了解事物的结构方式。Tab View 控制器只包含一堆 ViewController,您只需将其中一个视图控制器设为 NavigationController。

于 2013-02-22T15:31:26.937 回答
1

如果您不介意启动一个新应用来获得基础知识,请尝试以下操作:

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

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

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

在此处输入图像描述

您的结果将如下所示:

在此处输入图像描述

干杯!

于 2013-02-22T15:26:19.470 回答
1

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

您必须从 Empty Application 模板开始,然后执行以下步骤:

  • 添加一个新文件,用户界面,应用程序 Xib。在本教程中,我假设您将其命名为“Application.xib”
  • 转到您的 AppDelegate.h 文件并更改此行:

    @property (strong, nonatomic) UIWindow *window;

添加 IBOutlet:

@property (strong, nonatomic) IBOutlet UIWindow *window;
  • 进入 AppDelegate.m 并使用此更改您的 applicationDidFinishLaunching 方法

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // delete all and leave only the return
    return YES;
}
  • 进入 Application.xib,从 Objects Menu 中选择“App Delegate”,然后在身份检查器中更改 Class --> 写入 AppDelegate(或您的 AppDelegate.h 类名)
  • 始终在 Application.xib 中,再次右键单击 App Delegate Object,您将看到一个“窗口”Outlet --> 将其链接到左侧对象检查器中的 Window 对象
  • 现在,回到项目,进入支持文件 main.m 并像这样更改返回行:

return UIApplicationMain(argc, argv, nil, nil);
  • 然后,进入主 .plist 文件并添加一个键:右键单击,添加,键,“主 Nib 文件基本名称”,类型字符串,值“应用程序”(不带引号,不带 .xib 扩展名)

好的,现在您有一个空的“旧式”笔尖应用程序。现在您可以再次进入 Application.xib,拖动您的 TabBar 并将其链接为窗口“根视图控制器”(右键单击窗口,链接根视图控制器属性)。然后,在选项卡栏内,您可以拖动 ViewControllers、Navigation 控制器、ecc...

如果您需要其他详细信息或图片,请写信给我

编辑:

如果您想查看,我上传了一个示例项目:http ://www.lombax.it/documents/ManualTab.zip

截屏: 在此处输入图像描述

于 2013-02-22T16:02:33.437 回答
1

我有一个工作应用程序,我想将它放在选项卡式应用程序的一个“腿”下。我想在其他选项卡下开发“更大的应用程序”的其他部分。我不想使用故事板。这消除了我找到的很多解决方案。其余的大多数解决方案都是使用旧版本的 Xcode 开发的,它们根本不适用于我在 2013 年 2 月下载的 Xcode 版本。

我尝试创建自己的选项卡式应用程序 - (从“空应用程序”开始),正如该线程上的一些开发人员所使用的那样。我觉得我快要接近了,但我根本无法让它发挥作用。

Vishal Kurup 有一个关于使用“带有导航控制器的选项卡式应用程序”的优秀教程。

通过按照视频进行小修改(如下所列),我能够将现有应用程序滑入 Xcode 创建的默认“选项卡式应用程序”下。

在 Xcode 4.3 中使用导航控制器 + 详细视图创建 TabBar 控制器

可以在

http://www.youtube.com/watch?v=UMpNbCs4mr4

我必须对默认的“选项卡式应用程序”进行的唯一真正更改是在 AppDelegate.m 中:

选择“选项卡式应用程序”提供的以下代码不符合我的目的

    self.tabBarController.viewControllers = @[viewController1, viewController2];

这确实

 self.tabBarController.viewControllers = [NSArray arrayWithObjects:navigation ,
     viewController1 ,viewController2, viewController3, viewController4,  nil];

非常感谢 Vishal Kurup 先生。他制作了许多关于 iOS 开发的优质视频。

于 2013-05-06T15:00:06.870 回答