繁体   English   中英

setRootViewController:在setViewControllers:被调用后无法按预期工作

[英]setRootViewController: doesn't work as expected after setViewControllers: have been called

我以编程方式创建了一个视图控制器,并将其设置为根控制器。 一切都按预期完成了:

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编程指南”之后,我仍然不明白我在哪里错了。

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

您能给我解释一下发生了什么吗,还是请我指出我应该阅读的文档?

更新:我不会将'vc'控制器插入到'tbc'控制器中。 我想要的是全屏显示“ vc”视图,就像通常不用“ tbc”代码显示的那样。 从我的角度来看,添加另一个视图(在我的情况下为tbc)不应影响此行为。

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

您应该将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;

将vc添加到选项卡栏控制器时,它将成为该控制器的子级。 窗口的根视图控制器不能为子级,这就是为什么会出现该错误的原因。 如果要使vc为全屏显示,则不要将其放在选项卡栏控制器中,然后在某个时候将窗口的根视图控制器切换为选项卡栏控制器(如果您要这样做的话)。

您尚未说出要使用vc的功能。 一种更好的方法(取决于其用法)可能是从选项卡栏控制器的第一个选项卡中的任意一个控制器中模态显示(这样就占据了整个屏幕)。 从viewDidAppear执行此操作,这将是用户在应用启动时首先看到的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM