在以编程方式将UITabBarController添加到UIWindow后丢失旋转支持

时间:2011-07-11 12:10:53

标签: ios uiviewcontroller uitabbarcontroller rotation uiwindow

我的应用程序开始时只有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:...]。那是为什么?

1 个答案:

答案 0 :(得分:1)

很奇怪。我在一个简单的基于标签栏的项目中尝试并模拟了你的“视图流程”,并且在移除初始控制器并将标签栏控制器的视图添加为子视图后,自动旋转有效。

我找到的唯一不起作用的条件是self.window确实包含我没有删除的第二个子视图。你可以在执行时检查

 [self.window addSubview:tabBarController.view];

什么是self.window.subview内容?

如果这没有帮助,您是否可以在问题中分享如何初始化UITabBarControllerUITabBar

至于你的第二个问题,正如你所说rootViewController是属于该窗口的所有视图的根控制器:

  

根视图控制器提供窗口的内容视图。将视图控制器分配给此属性(以编程方式或使用Interface Builder)将视图控制器的视图安装为窗口的内容视图。如果窗口具有现有视图层次结构,则在安装新视图之前将删除旧视图。

Source

您也可以使用它,但要注意在applicationDidFinishLaunching中已经分配它,否则,如果您“手动”添加子视图并稍后更改此属性,则不会删除您明确添加的子视图。< / p>