1

我以编程方式创建了一个视图控制器并将其设置为根控制器。一切都如预期的那样完美:

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)不应该影响这种行为。

当然,从实际的角度来看,这毫无用处,但我想知道引擎盖下发生了什么。

4

2 回答 2

0

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

你还没有说你想用vc做什么。根据其用途,更好的方法可能是从标签栏控制器的第一个标签中的任何控制器以模态方式呈现它(因此它占据整个屏幕)。从 viewDidAppear 执行此操作,这将是用户在应用启动时首先看到的内容。

于 2013-01-23T17:00:18.213 回答
0

你应该设置tbcrootViewController.

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;
于 2013-01-23T14:16:20.447 回答