gpt4 book ai didi

objective-c - 第二次调用 loadView 时,iOS 5 不会自动旋转 View

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:51:03 25 4
gpt4 key购买 nike

当我在横向模式下运行我的应用程序时,第二次加载我的 View Controller 的 View 并调用 loadView 时,iOS 5 没有将 Root View Controller 的 View 从纵向旋转开,也不是调用 View Controller 的 willRotate/willAnimateRotation/didRotate 方法。

如前所述,这仅在 View 被卸载并且 loadView 被第二次调用后才会发生。在我的应用程序中,有时我会在将 View Controller 的 View 设置为 Root View Controller 之前以编程方式卸载它。但是,当 View Controller 的 View 由于内存不足警告而自动卸载时,也会发生这种情况。

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

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

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

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

最佳答案

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

我建议解决这个问题,方法是使用[newController setupStuff](因此将 View 设置为nil),但是相当压倒一切

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

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

并在它实际出现在屏幕上之前重置(已加载的) View 。

附加信息:

a) 您不需要将 View 设置为零。系统会为您做到这一点。当您下次访问该 View Controller 的 View 属性时,系统调用 loadView 重新创建 View :

If you access this property and its value is currently nil, the view controller automatically calls the loadView method and returns the resulting view. The default loadView method attempts to load the view from the nib file associated with the view controller (if any).

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

 self.window.rootViewController = newController;

对比

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

前者完全无视方向,后者则不然。

让事情变得更复杂的是,如果一个人不覆盖 loadView,而是让系统自动创建一个空的 UIView,并且只在 中修改该 View >viewDidLoad,内存警告不会自动将 View 设置为 nil 并释放它 - 文档:

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

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

案例 1 - 覆盖 loadView:
触发内存警告调用 didReceiveMemoryWarningviewDidUnload

情况 2 - 无 loadView:
在模拟器中触发内存警告调用didReceiveMemoryWarning,而不调用viewDidUnload

我会说,手动添加 View ...

干杯。

关于objective-c - 第二次调用 loadView 时,iOS 5 不会自动旋转 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8568209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com