setRootViewController:在调用setViewControllers:之后无法正常工作

时间:2013-01-23 14:07:04

标签: ios objective-c uiviewcontroller

我以编程方式创建了一个视图控制器,并将其设置为根控制器。所有工作都达到了预期的效果:

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的“View Controller Programming Guide”后,我仍然不明白我错在哪里。

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

你能解释一下我发生了什么事,或者指出我应该阅读的文件吗?

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

当然,从实际的角度来看,这是无用的,但我想知道幕后发生了什么。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

您还没有说过要使用vc的内容。根据其使用情况,更好的方法可能是从标签栏控制器的第一个选项卡中的任何控制器进行模态显示(因此它占据整个屏幕)。从viewDidAppear执行此操作,这将是用户在应用启动时看到的第一件事。