手机休眠/锁定时,UIAlertViewDelegate方法didDismissWithButtonIndex被调用

时间:2009-07-27 22:23:43

标签: iphone cocoa-touch

我有一个UIAlertView谁的didDismissWithButtonIndex委托方法调用弹出视图控制器(同一个类,它是alertview委托和viewcontroller),以将用户返回到上一个屏幕。问题是当你在[提示显示]之前锁定手机时;被叫,某事在电话被锁定时调用didDismissWithButtonIndex。由于对此的响应是弹出视图控制器,它释放并释放它,我在回调时崩溃。

是什么导致按下这个幻象按钮?看起来像一个框架错误,但我讨厌跳到那个结论。我肯定没有按下按钮,因为我在显示之前在代码中遇到了一个断点。然后我锁定了手机。然后我继续我看到它做了show,返回到事件循环,然后,当手机仍然被锁定时,在didDismissWithButtonIndex中点击我的断点。有一些关于类似虚假委托电话的互联网/论坛帖子,但没有具体的答案。

这是在模拟器和设备上,包括OS 2.2和OS 3.0。我假设我错过了什么,但是什么?

更新:是的,我创建了一个只有两个视图控制器的简单项目,当第二个视图控制器显示它时会创建警报并显示它。然后我在NSCL中使用委托方法,当手机被锁定时,它会在锁定时触发一次,然后在解锁时再次点击并按下按钮... 2日志消息。但是当没有锁定时,只有一个。

我想我会打开一个问题,但在没有人抱怨的情况下幸存下来似乎非常明显。 :-)我将尝试通过在willResignActive / didBecomeActive通知到达时创建一个isActive标志值来解决它,如果应用程序没有激活,则跳过委托主体。

更新我发布此消息并在7月份为此问题创建了雷达7097363。没有回应。

实践中的解决方法非常有效,在处理委托时检查活动状态,如果应用程序处于非活动状态则跳过操作。

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。

当设备被锁定时,始终调用alertView委托方法didDismissWithButtonIndex,并将按钮索引值设置为0(此值独立于cancelButtonIndex的值)。

当按钮索引为0时,我通过在委托方法中不执行任何操作来解决此问题。这可能在您的代码中无法实现。

答案 1 :(得分:1)

作为一种更简单的解决方法,只有didDismissWithButtonIndex以这种方式被调用。 clickedButtonAtIndex和willDismissWithButtonIndex都不会在锁定情况下被调用。

在正常的事物流中你会得到一个“clickedButtonAtIndex”然后是“willDismissWithButtonIndex”,最后是“didDismissWithButtonIndex”。手机锁定后,您只能获得“didDismissWithButtonIndex”。因此,如果您使用其他两个中的一个而不是“didDismissWithButtonIndex”,那么在锁定过程中您将不会受到打扰。

答案 2 :(得分:0)

罗布,

您是否能够在最小项目中复制问题,例如导航控制器和两个视图控制器,其中第二个(从第一个推送到导航堆栈)包含UIAlertView和委托。似乎如果它发生在那里,那么它可能是一个错误,否则,它是你的代码。 ; - )

答案 3 :(得分:0)

此处类似的问题:我的电话被锁定无关,但我偶尔会在按钮指数为0的情况下获得额外的“didDismiss”电话,而警报实际上仍在显示。

我确定我正在以一种我无法弄清楚的方式错误地使用UIAlertView(线程问题,或者在解除其他modalViewController之后实际重新加载视图之前显示警报,或者。 ..?)。

作为一种解决方法,我在“didDismiss”方法的顶部抛出了这个声明,并且它有效(我怀疑它出于显而易见的原因不适用于“willDismiss”):

- (void) alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{

    if (alertView.superview != nil)
    {
        // alert is still in some superview, so this is a false call to didDismiss
        return;
    }

    // the rest of your code

}