UIAlertViewDelegate
协议定义了两种方法,alertView:clickedButtonAtIndex:
和alertView:didDismissWithButtonIndex:
,在我看来它们的用途相同。
为什么当他们都做同样的事情时会有clickedButtonAtIndex
和didDismissButtonWithIndex
?我发现在警报视图被解除之前还有一个willDismissButtonWithIndex
,但有没有理由使用clickedButtonAtIndex
代替didDismissButtonWithIndex
?
答案 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}更有意义。