UIAlertViewDelegate clickedButtonAtIndex:有用吗?

时间:2010-03-22 16:48:00

标签: iphone cocoa-touch

UIAlertViewDelegate协议定义了两种方法,alertView:clickedButtonAtIndex:alertView:didDismissWithButtonIndex:,在我看来它们的用途相同。

为什么当他们都做同样的事情时会有clickedButtonAtIndexdidDismissButtonWithIndex?我发现在警报视图被解除之前还有一个willDismissButtonWithIndex,但有没有理由使用clickedButtonAtIndex代替didDismissButtonWithIndex

4 个答案:

答案 0 :(得分:19)

我发现两者之间有一个更有用的区别:

当显示UIAlertView并且设备进入休眠状态时,alertView:didDismissWithButtonAtIndex:会被调用,即使警报视图实际上没有被解除。一旦设备唤醒,它将再次显示。只有在用户点击其中一个按钮时才会调用alertView:clickedButtonAtIndex:

答案 1 :(得分:12)

当用户单击警报视图上的按钮时调用alertView:clickedButtonAtIndex:,而在屏幕上关闭警报视图后调用alertView:didDismissWithButtonIndex:。 (参见UIAlertViewDelegate Protocol Reference。)

差异很小,但它允许你在动画之前或之后做一些事情。

答案 2 :(得分:1)

如果警报视图因任何原因消失(包括被另一个UIAlertView覆盖,进入睡眠状态等),则会调用didDismissWithButtonAtIndex:。这可能意味着即使用户没有点击任何内容也可以调用该方法。如果您依赖于响应用户实际单击按钮而调用此委托回调,则可能会导致意外行为。在这种情况下,clickedButtonAtIndex:更有用。

答案 3 :(得分:1)

通过使用iOS 7上的警报视图锁定我的设备,我无法重现Ed的行为。

但是,alertView:clickedButtonAtIndex:alertView:didDismissWithButtonIndex:alertView:willDismissWithButtonIndex:之间最重要的区别是第一种方法(clickedButtonAtIndex:)仅在用户明确点击时调用在警报视图上的按钮上(因此点击了')。

是否可以在不点击按钮的情况下解除警报视图?是的,您可以使用UIAlertView方法dismissWithClickedButtonIndex:animated:以编程方式隐藏警报视图。

因此,如果您需要在解除警报视图时始终触发某些行为 - 无论是由用户点击按钮触发还是以编程方式触发 - 然后使用didDismissWithButtonIndex:和{{1}更有意义。