以编程方式解除iOS 5上的UIAlertView不会调用didDismiss委托方法

时间:2011-10-13 04:48:50

标签: iphone ipad uialertview ios5

我遇到了一个问题,当我调用UIAlertView的dismissWithClickedButtonIndex:animated:时,9次中有9次,委托方法alertView:willDismissWithButtonIndex:未被调用。还有其他人遇到这个问题吗?我即将向Apple提交一个错误,但我很想知道是否还有其他人遇到过这个问题,并想出任何解决方法。

4 个答案:

答案 0 :(得分:9)

为了确保iOS4和5之间的一致行为,您可以在调用其 dismissWithClickedButtonIndex:animated:方法之前删除UIAlertView的委托,然后手动调用委托方法。 e.g。

- (void)somethingDidHappen {
    id<UIAlertViewDelegate> delegate = myAlertView.delegate;
    myAlertView.delegate = nil;
    // now, we know the delegate won't be called...
    [myAlertView dismissWithClickedButtonIndex:0 animated:NO];
    // ...so we call it ourselves below
    [delegate alertView:myAlertView clickedButtonAtIndex:0];
}

(该代码未经过测试,但您明白了。)

答案 1 :(得分:2)

只有在用户执行操作时才会调用UI对象的代理。 Apple假设当您从代码中执行某些操作时,您已经知道自己在做什么,并且不需要通知您。这适用于所有委托(滚动UIScrollView的委托方法与代码滚动,表视图操作,...)
无论如何,代表被调用的按钮索引是什么?..当你以编程方式解雇时没有人

答案 2 :(得分:1)

根据Why doesn't dismissWithClickedButtonIndex ever call clickedButtonAtIndex?,问题是正在调用另一种方法。但是,这并不能解释为什么会出现不稳定的调用。在我测试的设备上,正确调用了dismiss方法,因此我只将其重定向到点击版本。

如果你继续看到不稳定的行为,也许你应该向Apple提交一个错误。

答案 3 :(得分:0)

alertView:clickedButtonAtIndex:alertView:didDismissWithButtonIndex:alertView:willDismissWithButtonIndex:。您引用的方法(clickedButtonAtIndex:)仅在用户明确点击警报视图上的按钮时调用(因此“点击”)。

通过dismissWithClickedButtonIndex:animated:拨打电话以解除警报似乎不会调用alertView:clickedButtonAtIndex:

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