2012-02-10 100 views
2

我正在开发一个作为基于TabBarController的应用程序开始的项目,而且大部分仍然是,但一些需求已更改,我们需要将初始视图控制器作为应用程序其余部分的入口点 - 在给定身份验证并加载了一些内容之后,它将在标签栏控制器的主窗口中被替换。从XIB加载UITabBarController不包含任何来自XIB的内容

最初的UITabBarController是MainWindow.xib的一个组件,并且它的所有根控制器都设置了根视图控制器,并且一切都很顺利。我想我可以简单地从MainWindow.xib中提取的UITabBarController组成部分,把它放在自己的CustomTabBarController.xib,然后运行

[self setTabBarController:[[[UITabBarController alloc] initWithNibName:@"CustomTabBarController" bundle:nil] autorelease]]; 
[_tabBarController setDelegate:self]; 
[self.window addSubview:_tabBarController.view]; 

然而,除了获得预构建的标签栏控制器我所料,我得到一个完全空的标签栏控制器。

我错过了什么吗?为什么我无法从笔尖加载预构建的UITabBarController?

回答

5

试试这个:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"CustomTabBarController" owner:nil options:nil]; 
UITabBarController *controller = [nibContents objectAtIndex:0]; 

[self setTabBarController:controller]; 
[_tabBarController setDelegate:self]; 
[self.window addSubview:_tabBarController.view]; 

这有点棘手解释为什么,但它与文件的所有者是如何工作要做。如果标签栏控制器在nib文件中定义,则无法将nib文件加载到标签栏控制器中。

笔尖总是必须由一个对象在笔尖中定义的对象的上方加载 - 所以应用程序委托可以加载视图控制器,视图控制器可以加载视图等。但视图控制器(包括TabBarController)无法加载自身。

+0

这是我最终做的。因为我实际上有一个自定义的UITabBarController子类,它有一些辅助方法,所以我最终重载了'-init'方法来使用'[[nibContents objectAtIndex:0] retain]'而不是'[super init]'。但是,如果不调用retain,则在子类初始化后不久就会释放它。谢谢你的提示! – 2012-02-16 14:51:29