Objective-c嵌套的VIewControllers

时间:2013-08-07 17:13:50

标签: objective-c view uiviewcontroller

我想创建一个类似于iPhone的本机应用程序“Phone”的App whit结构。我会更准确地说,电话应用程序有一个tabBar,其中包含:“收藏夹”,“最近”,“联系人”,“键盘”和“语音邮件”。

当我们进入标签联系人时,我们可以看到导航栏和tableView。 我想有一个类似的结构,但我在问自己哪个是最好和最正确的方法呢?

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

我会喜欢

[myTabBar.view addSubview:myNavController];

但是如何设置这些实例呢?一旦我有自动创建的ViewController,我创建一个SecondviewController我怎么能将它们设置为TabViewController和我的NavViewController?

1 个答案:

答案 0 :(得分:2)

如果您正在使用故事板,只需在故事板中添加标签栏控制器即可。然后选择一个标签栏的子场景,然后从Xcode“Editor”菜单中选择“Embed In” - “Navigation Controller”。如果您为要使用导航控制器的任何选项卡重复该过程。在这个屏幕快照中,我已经为第一个和第三个选项卡添加了导航控制器,但没有添加第二个选项卡。

希望这说明了这个想法。

tab bar controller with navigation controllers embedded


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

Tabbed Application

然后打开app delegate .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),但希望这能说明这两种技术。