如何将2个ViewControllers添加到同一窗口

时间:2010-06-27 04:03:46

标签: iphone cocoa cocoa-touch

我在iTunes U中关注斯坦福大学的iPhone开发课程,我的任务中遇到了一个问题(狗仔队,如果有人熟悉的话)。

我要做的是基本上在应用程序启动时将此视图创建为第一个“屏幕”:

http://cl.ly/1USw/content

这是我在app delegate中的代码:

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

    // PersonListViewController is the 'content' of the screen (image, name, and button)
 PersonListViewController* personList = [[PersonListViewController alloc] initWithNibName:@"PersonListViewController" bundle:[NSBundle mainBundle]];
 navController = [[UINavigationController alloc] initWithRootViewController:personList];
 [personList release];

 UITabBarController* tabBarController = [[UITabBarController alloc] init];
 [window addSubview:[tabBarController view]];
 [window addSubview:[navController view]];
    [window makeKeyAndVisible];

 return YES;
}

但是这段代码似乎没有显示底部的tabBar,只显示导航栏和中间的视图(图像,名称和按钮)。

有人可以向我解释我做错了什么以及如何解决它?

2 个答案:

答案 0 :(得分:3)

您通常做的是将主ViewController(在本例中为PersonListViewController)嵌套在UINavigationController中(就像您所做的那样),但是您将tabBarController.viewControllers属性设置为等于一组视图控制器(每个选项卡一个)。

在您的情况下,这看起来像

tabBarController.viewControllers = [NSArray arrayWithObject:navController];

然后只将tabBarController的视图添加到窗口

[window addSubview:[tabBarController view];

这将为您提供导航控制器内部选项卡控制器内的列表(并且标签控制器目前只有一个选项卡)。

答案 1 :(得分:2)

如果您尝试将两个视图控制器中的视图放入其中,UIWindow无法很好地处理:只有最后一个将获得适当的回调,并且他们不会彼此了解。 (我故意这样做,当我想要一个透明的视图集后面的恒定动画背景,但它很棘手。)在ios4中这更加明确:UIWindow已经增长了一个“rootViewController”属性,其中包含 VC为窗口。

您需要的是一个标签栏控制器包含导航控制器,每个标签一个,每个包含一个自定义VC。

有点像:(这是袖口和未经测试,所以注意错误)

PersonListViewController* plvc = [[[PersonListViewController alloc]
                                    initWithNibName:@"PersonListViewController"
                                             bundle:nil]
                                    autorelease];

UINavigationController *uinc = [[[UINavigationController alloc]
                                  initWithRootViewController:plvc]
                                  autorelease];
// ... make more VCs for any other tab pages here

UITabBarController* tbc = [[[UITabBarController alloc] init] autorelease];

[tbc setViewControllers:[NSArray arrayWithObjects: uinc, nil]]; // *1

/* iOS 4 and later, preferred: */
[window setRootViewController:tbc];

/* or, alternatively, in iOS 3:
[window addSubview:[tbc view]];
[self setMyMainTabsController:tbc]; // must keep an owning reference or it'll get released
*/

[window makeKeyAndVisible];

在* 1,将其他选项卡的任何VC添加到列表中。

将导航控制器放在标签控制器内是完全合法的,Apple认可。将标签控制器放在导航控制器中不是,尽管它可能在有限的情况下有效。