为什么[uiActionSheet showInView:self.view.window]在iOS8中“挂起”?

时间:2015-02-14 19:35:05

标签: uiview ios8 uiactionsheet

我在AppStore中有一个应用程序(仅限iPhone,iOS3.1 +兼容,2011 Xcode 3编译),它已经连续三年保持良好的工作状态。最近它开始"冷冻"在某些条件下在iOS8上。这种情况发生在几个地方,都要显示UIActionSheet。屏幕上没有任何东西弹出,应用程序不会崩溃但反而对任何水龙头都没有反应;系统控制台没什么。唯一的方式" out"之后发生的是从任务切换器手动终止应用程序并再次启动它。

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

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应该解决问题(我在这里阅读https://stackoverflow.com/a/26171717/226086 showInView:现在只适用于附带UIViewController的UIView)。为什么我首先使用self.view.window-可能我读了this issue取消按钮对齐。

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

您是否了解UIActionSheet的更改行为,是什么导致iOS8中的挂起?

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

2 个答案:

答案 0 :(得分:1)

这是一个很长的镜头,但是当你的app delegate didFinishLaunchingWithOptions:方法中留下以下行时,iOS8中存在与旋转无关的问题。该行是iOS8 xcode生成之前的宿醉,与应用程序的窗口有关。仅影响iOS8。以前的版本都运行良好。

该行是:

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

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

正如我所说的那样,但是看起来很巧合,你在iOS8中遇到的问题只与使用窗口视图有关。

答案 1 :(得分:0)

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