Objective-c 嵌套视图控制器

Posted

技术标签:

【中文标题】Objective-c 嵌套视图控制器【英文标题】:Objective-c Nested VIewControllers 【发布时间】:2013-08-07 17:13:50 【问题描述】:

我想创建一个结构类似于 iPhone 的本地应用程序“电话”的应用程序。我会更准确地说,电话应用程序有一个 tabBar,其中包含:“Favorites”、“Recents”、“Contact”、“Keypad”和“Voice Mail”。

当我们在 tabcontacts 中输入时,我们可以看到一个导航栏和一个 tableView。 我想有一个类似的结构,但我在问自己哪种方法是最好和最正确的?

我想启动一个单一的视图应用程序,而不是使用自动创建为 TabbedViewController 的视图控制器,然后我将创建另一个 viewController 的另一个子类,并将其用作我的 NavViewController。

我会有类似的东西

[myTabBar.view addSubview:myNavController];

但是我如何设置这些实例?一旦我拥有自动创建的 ViewController 并创建了 SecondviewController 我如何将它们设置为 TabViewController 和我的 NavViewController ?

【问题讨论】:

您确实应该阅读链接到 UIViewController 类参考顶部的两个文档。他们会帮助你很多。 【参考方案1】:

如果您使用情节提要,只需将标签栏控制器添加到情节提要。然后选择标签栏的其中一个子场景,然后从Xcode“编辑器”菜单中选择“嵌入”-“导航控制器”。如果您对想要拥有导航控制器的任何选项卡重复该过程。在这个屏幕快照中,我在第一个和第三个选项卡中添加了一个导航控制器,但没有在第二个选项卡中添加。

希望这能说明这个想法。


如果您决定使用 NIB 执行此操作,最简单的开始方法是使用选项卡式应用程序模板创建一个新项目(显然,在下一个屏幕上,取消选中“使用情节提要”):

然后打开应用委托 .m 文件并替换默认的 didFinishLaunchingWithOptions,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[viewController1, viewController2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;

其中一个为您想要导航栏的每个选项卡创建一个单独的导航控制器(在这种情况下,我只将它添加到第一个,但它说明了这个想法):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    UINavigationController *navigationController1 = [[UINavigationController alloc] initWithRootViewController:viewController1];
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[navigationController1, viewController2]; // was @[viewController1, viewController2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;

这是启动基于 NIB 的选项卡式应用程序的一种相对简单的方法。然后,您可以从那里进行自定义。

就我个人而言,我很难想象为什么有人会使用 NIB 而不是故事板(除非您尝试支持 ios 4),但希望这能说明这两种技术。

【讨论】:

你能请谁没有故事板吗? @Mario,你为什么要在没有情节提要的情况下这样做? @Mario 我不知道你为什么要经历额外的 NIB 麻烦而不是故事板,但我已经用一个你可以做什么的例子更新了我的答案。跨度>

以上是关于Objective-c 嵌套视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

(Objective-C) 打开视图控制器

Swift SKScene 在 Objective-C 项目中显示为空白

无法从 Objective-C 视图控制器访问 Swift var - iOS

Objective-C 管理多个视图控制器

Objective-C - 理解视图控制器

在视图控制器上不显示视图控制器 - Swift / Objective-C