• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 18:36:47 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

当我在横向模式下运行我的应用程序时,第二次加载我的 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 的方式有关吗?



Best Answer-推荐答案


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

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

- (void)viewWillAppearBOOL)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 makeObjectsPerformSelectorselector(removeFromSuperview)];
 [self.window addSubview:newController.view];

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

为了让事情变得更复杂,如果一个人不覆盖 loadView,而是让系统自动创建一个空的UIView并且只在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:
在模拟器中触发内存警告only调用didReceiveMemoryWarning,而不是viewDidUnload

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

干杯。

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap