第二次调用loadView时,iOS 5不会自动旋转视图

时间:2011-12-19 22:08:10

标签: objective-c ios uiviewcontroller ios5 rotation

当我在横向模式下运行我的应用程序时,第二次加载视图控制器的视图并调用loadView时,iOS 5不会将根视图控制器的视图从纵向旋转,也不会调用视图controller的willRotate / willAnimateRotation / didRotate方法。

如上所述,只有在卸载视图并且第二次调用loadView之后才会发生这种情况。在我的应用程序中,我有时会在将其设置为根视图控制器之前以编程方式卸载视图控制器的视图。但是,当视图控制器的视图由于内存不足警告而自动卸载时,也会发生这种情况。

这只发生在iOS 5上,而不是iOS 4.x.它很容易在iOS模拟器中重现,这里是一个链接到一个独立的测试应用程序,可以重现这个问题:

http://www.mediafire.com/file/7ob5xw5ym02pasx/ViewControllerTest.zip

要查看问题,只需编译应用程序并使用iOS 5.0模拟器以横向模式启动它,然后点击“A”然后点击“返回”,您将看到如何不进行旋转。

有什么想法吗?这与我设置window.rootViewController的方式有关吗?

1 个答案:

答案 0 :(得分:4)

我通过它调试,似乎在4.3和5.0之间有变化。在4.3 UIKit调用[UIWindow addRootViewController:]中,在5.0中调用[UIWindow setRootViewController:]。所以也许改变了我们看不到的东西......

我建议使用[newController setupStuff] 来解决这个问题(因此将视图设置为nil),而是覆盖

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // do setup stuff here, reset content etc etc.
}

并在实际显示在屏幕上之前重置(已加载)视图。

其他信息:

a)您不需要将视图设置为nil。系统为您做到了这一点。下次访问该视图控制器的视图属性时,系统会调用loadView来重新创建视图:

  

如果您访问此属性且其值当前为nil,则视图为   controller自动调用loadView方法并返回   结果观点。默认的loadView方法尝试加载视图   来自与视图控制器关联的nib文件(如果有)。

b)这一切都归结为iOS 5中关于窗口rootViewController属性的行为。在iOS 5中,这两个等效:

 self.window.rootViewController = newController;

VS

 [self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
 [self.window addSubview:newController.view];

前者完全忽略了方向,后者则没有。

要使事情变得更复杂,如果有人不覆盖 loadView,而是让系统自动创建一个空的UIView并仅在viewDidLoad中修改该视图,内存警告不会自动将视图设置为nil并将其释放 - docs:

The default implementation releases the view only if it determines that it is safe to do so.

万。取决于是否覆盖方法。我无法以任何方式对此进行测试。

案例1 - 被覆盖loadView
触发内存警告会同时调用didReceiveMemoryWarningviewDidUnload

案例2 - 没有loadView
在模拟器中触发内存警告调用didReceiveMemoryWarning,而不是viewDidUnload

我会说,手动添加视图......

欢呼声。