我的应用程序开始时只有UIWindow
。我以编程方式将视图控制器添加到self.window
中的application:didFinishLaunchingWithOptions:
。
myViewController = [[UIViewController alloc] init:...];
...
[self.window addSubview:myViewController.view];
[self.window makeKeyAndVisible];
与此同时,我启动了后台流程:
[NSThread detachNewThreadSelector:@selector(startupOperations) toTarget:self withObject:nil];
startupOperations
看起来像这样:
NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init];
// Load data
...
// When your done, call method on the main thread
[self performSelectorOnMainThread:@selector(showMainViewController) withObject:nil waitUntilDone:false];
// Release autorelease pool
[threadPool release];
showMainViewController
删除myViewController,创建UITabBarController
并将其设置为窗口的主视图:
[self.myViewController.view removeFromSuperview];
self.myViewController = nil;
tabBarController = [[UITabBarController alloc] init];
...
[self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];
问题:
所有视图控制器都为shouldAutorotateToInterfaceOrientation:
返回YES。旋转适用于myViewController
,但只要tabBarController
可见,旋转就会停止工作,界面会出现在肖像中。这种行为背后的原因是什么?
此外,在iOS 4.x中,UIWindow具有rootViewController属性。这个房产的作用是什么?新模板使用rootViewController
代替[self.window addSubview:...]
。那是为什么?
答案 0 :(得分:1)
很奇怪。我在一个简单的基于标签栏的项目中尝试并模拟了你的“视图流程”,并且在移除初始控制器并将标签栏控制器的视图添加为子视图后,自动旋转有效。
我找到的唯一不起作用的条件是self.window
确实包含我没有删除的第二个子视图。你可以在执行时检查
[self.window addSubview:tabBarController.view];
什么是self.window.subview
内容?
如果这没有帮助,您是否可以在问题中分享如何初始化UITabBarController
和UITabBar
?
至于你的第二个问题,正如你所说rootViewController
是属于该窗口的所有视图的根控制器:
根视图控制器提供窗口的内容视图。将视图控制器分配给此属性(以编程方式或使用Interface Builder)将视图控制器的视图安装为窗口的内容视图。如果窗口具有现有视图层次结构,则在安装新视图之前将删除旧视图。
(Source)
您也可以使用它,但要注意在applicationDidFinishLaunching
中已经分配它,否则,如果您“手动”添加子视图并稍后更改此属性,则不会删除您明确添加的子视图。< / p>