2013-01-23 39 views
1

我以编程方式创建了视图控制器并将其设置为根控制器。所有因为预期的工作完美:setRootViewController:在setViewControllers之后无法按预期工作:已调用

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
CustomViewController *vc = [[CustomViewController alloc] init]; 
[[self window] setRootViewController:vc];  
self.window.backgroundColor = [UIColor whiteColor]; 
[self.window makeKeyAndVisible]; 
return YES; 

然后我添加了一个UITabBarViewController,设置它的“viewControllers”属性指向(数组)主要的viewController“VC”。

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
CustomViewController *vc = [[CustomViewController alloc] init]; 

UITabBarController *tbc = [[UITabBarController alloc] init]; 
NSArray *controllers = @[vc]; 
[tbc setViewControllers:controllers]; 

[[self window] setRootViewController:vc];  
self.window.backgroundColor = [UIColor whiteColor]; 
[self.window makeKeyAndVisible]; 
return YES; 

和视图采空,在启动时,屏幕显示,也有警告有关根视图控制器没有设置。在'vc'控制器的视图下面添加字符串后,终于加载了,但屏幕底部有一个空行,就好像UIBarController修改了[[UIMainScreen bounds]一样。

[[self window] addSubview:vc.view]; 

我是新来的iOS开发,我有点困惑。看起来我并不理解关于视图控制器层次结构的一些非常基本的东西,但在阅读Apple的“视图控制器编程指南”后,我仍然不明白我的错在哪里。

setRootViewController:方法应该自动将参数视图控制器的_view作为窗口的默认视图分配,但如果命名的视图控制器先前已由UITabBarViewController的viewControllers属性指向,则不会发生此情况。虽然我检查了调试器,发现调用setViewControllers:方法后'vc'对象没有改变。

您能解释一下发生了什么,或者指向我应该阅读的文档吗?

更新:我不打算将'vc'控制器插入'tbc'控制器。我想要的是全屏显示“vc”视图,因为它通常会显示没有关于“tbc”的代码。 从我的角度来看,添加另一个视图(在我的情况下是tbc)不应该影响这种行为。

当然,从实用的角度来看,这没什么用处,但我想知道底下会发生什么。

回答

0

您应该将tbc设置为rootViewController

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
CustomViewController *vc = [[CustomViewController alloc] init]; 

UITabBarController *tbc = [[UITabBarController alloc] init]; 
NSArray *controllers = @[vc]; 
[tbc setViewControllers:controllers]; 

[[self window] setRootViewController:tbc]; 
[[self window] addSubview:tbc.view]; 
self.window.backgroundColor = [UIColor whiteColor]; 
[self.window makeKeyAndVisible]; 
return YES; 
+0

我已更新该问题。困扰我的是稍微不同的东西。 –

0

当您将vc添加到标签栏控制器时,它将成为该控制器的子项。窗口的根视图控制器不能是一个孩子,这就是为什么你会得到这个错误。如果你希望vc是全屏,那么不要把它放在标签栏控制器中,然后在某个时候,你将窗口的根视图控制器切换为标签栏控制器(如果这是你想要的)。

你还没有说过你想用vc来做什么。根据其用途,更好的方法可能是从控制器的第一个选项卡中选择哪一个控制器以模态方式显示它(因此需要整个屏幕)。从viewDidAppear这样做,这将是用户在应用程序启动时看到的第一件事。