如何从视图层次结构中删除视图控制器?

时间:2011-01-10 22:48:06

标签: iphone

我的应用程序有一个欢迎屏幕,只能以纵向模式显示。在用户点击欢迎屏幕后,我想显示另一个可以在纵向模式和横向模式下使用的屏幕。

我已经设置了一个视图控制器,只为shouldAutorotateToInterfaceOrientation:实现了YES返回UIInterfaceOrientationPortrait,我将视图添加到[window addSubView:view]窗口。我使用标记1标记此视图。

当用户点击欢迎视图并且应用移动到新视图时,我会这样做:

[[window viewWithTag:1] removeFromSuperView];
[window addSubView:myViewController.view];

其中myViewController是第二个视图的视图控制器的实例(正确处理shouldAutorotateToInterfceOrientation方法)。

现在当我旋转时,它仍然在原始视图的视图控制器上调用shouldAutorotateToInterfceOrientation,并且不会在新视图的视图控制器上调用它。

This note from Apple表示只有一个视图控制器会获得轮换通知;但是,我已经删除了其他视图控制器。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

实际上,该说明没有说“只有一个视图控制器会收到通知”,而是说“只有添加到UIWindow的第一个视图控制器才会旋转。”。 所以这可能就是问题所在。

要解决此问题,我会说要始终在窗口中添加一个视图(称之为永久视图),并将欢迎屏幕和下一个视图添加到此永久视图中。

希望这有帮助。

答案 1 :(得分:1)

作为您链接到州的注释:

  

仅添加了第一个视图控制器   到UIWindow将旋转。

所以放一个标志,确保 shouldAutorotateToInterfceOrientation 返回NO,直到用户解除屏幕 - 然后返回YES。这是一个简单而有效的解决方案 - 但是,从代码可读性的角度来看,“被解雇的”视图实际上控制了旋转可能会让人感到困惑。

个人;我的经验是,让一些观点轮换而不是一些观点并不值得 - 而且用户往往不喜欢它。

快乐编码

答案 2 :(得分:1)

我写了一个快速测试,显示你想要做的事应该起作用。以下是我做的基础知识:

创建两个视图控制器。应用程序从AppDelegate中设置的第一个视图控制器开始,通过NIB文件进入实例变量viewController。然后在您编写时将其添加到窗口中。

然后我设置了一个动作,当被调用时(可能是一个Timer,第一个视图控制器上的按钮等)执行以下操作:

使用[self.viewController removeFromSuperview]删除视图。这与您使用标记的方式不同。

创建第二个视图控制器并将其分配给self.viewController。

添加到您指定的窗口。

不确定您的代码有什么不对。我猜想第一个视图可能并没有被删除。