Objective-c嵌套视图控制器

Objective-c嵌套视图控制器,objective-c,view,uiviewcontroller,Objective C,View,Uiviewcontroller,我想创建一个应用程序,其结构类似于iPhone的本机应用程序“Phone”。更确切地说,手机应用程序有一个选项卡,其中包含:“收藏夹”、“最近”、“联系人”、“键盘”和“语音邮件” 当我们在“联系人”选项卡中输入时,可以看到一个导航栏和一个表视图。 我希望有一个类似的结构,但我问自己,哪一个是最好的和最正确的方式去做 我想启动一个视图应用程序,而不是使用自动创建的视图控制器作为选项卡式viewController,然后我将创建另一个viewController的另一个子类,并将其用作我的NavV

我想创建一个应用程序,其结构类似于iPhone的本机应用程序“Phone”。更确切地说,手机应用程序有一个选项卡,其中包含:“收藏夹”、“最近”、“联系人”、“键盘”和“语音邮件”

当我们在“联系人”选项卡中输入时,可以看到一个导航栏和一个表视图。 我希望有一个类似的结构,但我问自己,哪一个是最好的和最正确的方式去做

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

我想要点像这样的

[myTabBar.view addSubview:myNavController];

但我如何设置这些实例?一旦我有了自动创建的ViewController并创建了第二个ViewController,如何将它们设置为选项卡ViewController和我的NavViewController

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

希望这能说明这个想法


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

然后打开app delegate.m文件,用选项替换默认的
didfishlaunching,如下所示:

- (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;
}
其中一个为每个需要导航栏的选项卡创建单独的导航控制器(在本例中,我仅将其添加到第一个选项卡中,但它说明了这个想法):

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


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

你能告诉我没有故事板的人是谁吗?@Mario,为什么你不想在没有故事板的情况下这样做?@Mario我不知道你为什么要经历NIB而不是故事板的额外麻烦,但我已经用一个例子更新了我的答案,说明了你可以做什么。你真的应该阅读UIViewController类参考顶部链接到的两个文档。他们会帮你很大的忙。
- (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;
}