【问题标题】:Why does [uiActionSheet showInView:self.view.window] "hang" in iOS8?为什么 [uiActionSheet showInView:self.view.window] 在 iOS8 中“挂起”?
【发布时间】:2015-02-14 19:35:04
【问题描述】:

我在 AppStore 中有一个应用程序(仅限 iPhone,兼容 iOS3.1+,2011 Xcode 3 编译),三年来一直运行良好,没有受到任何影响。然而,最近它在某些条件下开始在 iOS8 上“冻结”。这发生在几个地方,当 UIActionSheet 被显示时。屏幕上什么都没有弹出,应用程序不会崩溃,而是对任何点击都没有反应;系统控制台中没有任何内容。发生这种情况后,“退出”的唯一方法是从任务切换器中手动终止应用程序并重新启动它。

我相信原因是我从 UIViewController 方法显示 UIActionSheet 的方式,就像这 3 行一样简单:

UIActionSheet* actSheet = [[UIActionSheet alloc] initWithTitle:@"Could not connect to [...]" delegate:nil cancelButtonTitle:@"OK" destructiveButtonTitle:nil otherButtonTitles:nil]; 
[actSheet showInView:self.view.window]; 
[actSheet autorelease]; 

认为原因是使用了self.view.window,它是UIWindow(它自然地继承了UIView)-并且仅使用self.view应该可以解决问题(我在这里阅读@987654321 @ that showInView:现在仅适用于附加了 UIViewController 的 UIView)。为什么我首先使用 self.view.window - 可能我读到了 this issue 与取消按钮对齐。

但是,在 Xcode 6 中编译我的应用程序时,我无法重现该问题 - 并且 Xcode 3 无法调试 iOS8。我的难题是如何消除无法重现以验证的错误。

您是否对 UIActionSheet 的行为变化有见解,是什么导致 iOS8 中的挂起?

PS。请不要告诉我“UIActionSheet 在 iOS8 中已弃用,请改用 UIAlertController”。这是一个不正确的答案:“deprecated”并不意味着 UIActionSheet 不再在 iOS8 中工作 - 它只是不鼓励使用新代码,并且可能会在下一个版本中被删除。但我想保持与 iOS5+ 的兼容性(我的推理类似于 this)所以我宁愿修复它的使用 - 我上面提到的 showInView:self.view.window 似乎很可疑。

【问题讨论】:

  • 这3行在哪个UIViewController方法中调用?
  • 问题,它是在 iPad 上,还是在 iPhone 上?
  • @gwdp:仅限 iPhone - 谢谢,上面已更新。
  • @gagarwal,这些是在我的 UIViewController 的方法中调用的,它在屏幕上/具有焦点。它只是顶部的导航栏,下面是视图,没有选项卡。在一种情况下,调用在textFieldShouldReturn 中,在另一种情况下(另外两个) - 单击按钮时(touch-up-inside 事件处理程序)
  • @matt - 把评论变成答案,如果没有更好的解释,可以得到赏金吗?

标签: uiview ios8 uiactionsheet


【解决方案1】:

这是一个长镜头,但是当您的应用程序委托didFinishLaunchingWithOptions: 方法中留下以下行时,iOS8 中存在与旋转相关的问题。该行是 iOS8 之前的 xcode 生成的遗留问题,与应用程序的窗口有关。只影响iOS8。以前的版本都可以正常工作。

该行是:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

这不再需要并且应该被注释掉。鉴于您使用的是 self.view.window,也许 UIActionSheet 也有一些副作用。

正如我所说,这是一个长镜头,但您在 iOS8 中遇到的问题仅与使用窗口视图有关。

【讨论】:

  • 有趣的想法,所以 +1。但我没有手动创建/分配主窗口。
【解决方案2】:

我认为您使用UIAlertController 应该不会有问题,就对iOS 早期版本的支持而言,您可以尝试使用[[UIAlertController alloc] init] 创建UIAlertController 的实例,如果它返回nil(它将适用于旧版本) iOS 版本)您可以使用当前正在使用的 UIAlertSheet。

【讨论】:

  • 在 Xcode 6 下重新编译后,UIActionSheet 与之前使用的一样 - 再次工作,因此无需使用其他实体。然而,为什么它在 iOS8 下停止使用旧的可执行文件仍然是个谜。
  • 也许在使用 Xcode 6 编译时,基础 SDK 已更新到 iOS8.x,这就是它运行良好的原因,并且在较旧的可执行文件中,基础 iOS SDK 是较旧的。
  • @uchha - 是的,我认为这就是“修复”它的原因。但我不明白为什么用旧 SDK 编译的应用程序突然停止与 iOS8 一起工作?似乎 iOS8 正在某种模拟器中运行较旧的应用程序,其中 API 的工作方式与以前不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2021-06-09
相关资源
最近更新 更多