Root UIViewController响应方向更改,但第二个UIViewController没有

时间:2012-03-15 16:48:40

标签: ios uiviewcontroller uiinterfaceorientation

我发布这个是因为,在一天中的大部分时间(以及许多Google和StackOverflow搜索)中遇到此问题之后,我终于找到了问题,但我没有在任何地方看到这个解决方案

我有一个带有UINavigationController作为根控制器的应用程序和两个由根控制器拥有的UIViewControllers。所有都是以编程方式创建的,我根本不使用Interface Builder。两个UIViewControllers都设置为处理所有方向的旋转(据称),但只有根UIViewController正确旋转。对于第二个UIViewController,shouldAutoRotateToInterfaceOrientation触发一次,但从不再触发,并且willRotateToInterfaceOrientation根本不会触发。

有问题的视图控制器只有子视图的标准控件:UILabel,UITextView和UISwitch。它不包含tabBar或任何其他视图控制器作为子视图。 View和VC都在范围内,看起来都很健康。除旋转外,与视图的所有交互都能正常工作。

我特意打电话:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications

并实施:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

以及didRotate方法没有任何区别。

2 个答案:

答案 0 :(得分:0)

在iOS 5中,如果您手动添加视图,则很可能需要应用方法addChildViewController:

答案 1 :(得分:0)

我发现的问题是我的一个愚蠢的问题:我在视图控制器实例上调用了alloc而没有init(在编辑中丢失了,在我的辩护中)。让它如此令人惊讶的是,视图在所有其他方面都能正常运行。我读过这篇Apple Technical Q& A:http://developer.apple.com/library/ios/#qa/qa1688/_index.html,但没有把它与我看到的问题联系起来。关键行是最后一句:对于要正确初始化的对象,必须在覆盖视图控制器的任何init或initWithNibName方法上调用super。由于init根本没有被调用,当然[super init]也从未发生过。