我遇到了一个问题,当我调用UIAlertView的 dismissWithClickedButtonIndex:animated: 方法时,十有八九不会调用委托方法alertView:willDismissWithButtonIndex:。还有其他人遇到这个问题吗?我准备向苹果报告此错误,但我很想知道是否有其他人遇到了这个问题并找到了任何解决方法。
我遇到了一个问题,当我调用UIAlertView的 dismissWithClickedButtonIndex:animated: 方法时,十有八九不会调用委托方法alertView:willDismissWithButtonIndex:。还有其他人遇到这个问题吗?我准备向苹果报告此错误,但我很想知道是否有其他人遇到了这个问题并找到了任何解决方法。
- (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];
}
那段代码没有经过测试,但你应该明白它的意思。
UI对象的代理只在用户执行操作时才会被调用。苹果公司认为,当您从代码中做某些事情时,您已经知道自己在做什么,不需要被告知。这适用于所有代理(UIScrollView的滚动代理方法与代码滚动、表格视图操作等)。
无论如何,在程序中自动解除时,代理应该使用哪个按钮索引?.. 没有一个。
有 alertView:clickedButtonAtIndex:
, alertView:didDismissWithButtonIndex:
和 alertView:willDismissWithButtonIndex:
。你所指的方法 (clickedButtonAtIndex:
) 只有在用户明确点击警报视图上的按钮时才会被调用(因此是“clicked”)。
通过 dismissWithClickedButtonIndex:animated:
进行编程调用以关闭警报似乎不会调用 alertView:clickedButtonAtIndex:
。
因此,如果您需要某些行为始终在警报视图关闭时触发 - 无论是由用户点击按钮还是通过编程触发 - 那么使用 didDismissWithButtonIndex:
和 willDismissWithButtonIndex:
更合理。