以编程方式在iOS 5上关闭UIAlertView不会调用didDismiss委托方法。

4

我遇到了一个问题,当我调用UIAlertView的 dismissWithClickedButtonIndex:animated: 方法时,十有八九不会调用委托方法alertView:willDismissWithButtonIndex:。还有其他人遇到这个问题吗?我准备向苹果报告此错误,但我很想知道是否有其他人遇到了这个问题并找到了任何解决方法。

4个回答

9
为了保持iOS4和5之间的一致行为,您可以在调用UIAlertView的dismissWithClickedButtonIndex:animated:方法之前删除其委托,然后手动调用委托方法。例如:
- (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];
}

那段代码没有经过测试,但你应该明白它的意思。


2

UI对象的代理只在用户执行操作时才会被调用。苹果公司认为,当您从代码中做某些事情时,您已经知道自己在做什么,不需要被告知。这适用于所有代理(UIScrollView的滚动代理方法与代码滚动、表格视图操作等)。
无论如何,在程序中自动解除时,代理应该使用哪个按钮索引?.. 没有一个。


1
对,这适用于大多数委托方法,除了这个。根据苹果的文档,在调用dismissWithClickedButtonIndex:animated:时,您提供要用于委托的按钮索引。此外,这种行为仅从iOS 5开始发生;在iOS 4及更早版本中,当您以编程方式解除警报视图时,委托方法按预期工作。另一个令人发狂的事情是,有时它会起作用,所以我不能只插入对我的alertView:didDismissWithButtonIndex:方法的调用,因为它会被调用两次。 - Vince

1
根据为什么dismissWithClickedButtonIndex从不调用clickedButtonAtIndex?,问题在于调用了不同的方法。然而,这并不能解释为什么会出现不稳定的调用。在我测试的设备上,dismiss方法被正确调用,所以我只是将其重定向到点击版本。
如果您继续看到不稳定的行为,也许您应该向苹果报告一个错误。

0

alertView:clickedButtonAtIndex:, alertView:didDismissWithButtonIndex:alertView:willDismissWithButtonIndex:。你所指的方法 (clickedButtonAtIndex:) 只有在用户明确点击警报视图上的按钮时才会被调用(因此是“clicked”)。

通过 dismissWithClickedButtonIndex:animated: 进行编程调用以关闭警报似乎不会调用 alertView:clickedButtonAtIndex:

因此,如果您需要某些行为始终在警报视图关闭时触发 - 无论是由用户点击按钮还是通过编程触发 - 那么使用 didDismissWithButtonIndex:willDismissWithButtonIndex: 更合理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接