0

我写了一段代码来“做某事->显示警报1->做某事->显示警报2”。


    //do something
    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"Alert 1" 
                          message:nil 
                          delegate:nil 
                          cancelButtonTitle:@"OK" 
                          otherButtonTitles:nil];
    [alert show];
    [alert release];
    //do something  
    UIAlertView *alert2 = [[UIAlertView alloc] 
                           initWithTitle:@"Alert 2" 
                           message:nil 
                           delegate:nil 
                           cancelButtonTitle:@"OK" 
                           otherButtonTitles:nil];
    [alert2 show];
    [alert2 release];

突然,多个AlertViews发生了一件奇怪的事情:它显示“Alert 1”->“Alert 2”(按'OK')->“Alert 1”。为什么“警报 1”又出现了?我还没有写任何委托方法。也许是一个错误?(感谢 cobbal,当 alert2 出现时,alert1 仍然存在。)

我发现 -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 效果很好。委托方法是显示多个警报视图的常用方法吗?

4

3 回答 3

2

我猜想显示警报 1,然后被警报 2 覆盖,因为显示不是模态的。当警报 2 关闭时,警报 1 仍处于打开状态。

对于你的第二个问题,alertView:didDismissWithButtonIndex:可能会更好,但我还没有实际测试过。

于 2009-03-19T12:17:39.737 回答
0

委托是为了在解除警报时通知您,以及使用哪个按钮解除警报。它不会影响警报是否被完全解除。

警报将保持可见,直到您通过点击按钮(如果有 - 它们不是必需的)或您调用警报实例的任何一个[UIAlertView dismissWithClickedButtonIndex:animated]或(未记录的)方法将其关闭。dismiss

看起来(正如 Cobbal 建议的那样),警报 2 弹出警报 1,您解除警报 2,警报 1 仍然存在(直到它本身被解除)。

您是否有特殊原因要在另一个警报仍在显示时显示新警报?也许更多的上下文可以帮助我们找到问题的根源,我怀疑这可能是一个设计问题。

[编辑] 回到这里并再次阅读,我想知道您是否使用委托方法询问的是您是否应该从那里显示警报 2?在这种情况下,这可能就是您想要的——无论是直接的还是间接的。间接我的意思是你可能在其他地方设置了一些状态来确定是否应该显示警报 2(或导致它的情况)。当您显示第一个警报时,可以设置该状态(也许是一个标志),并在解除警报时清除(从委托方法)。

于 2009-03-19T12:57:52.697 回答
0

发生这种情况的原因是 UIAlertView 在显示时不会阻塞。在显示警报视图后编写的任何代码都将在显示警报后直接运行。

你应该有两种不同的方法。一个做某事然后显示警报,然后另一个做某事并显示另一个警报。

启动第一个方法来做某事并显示警报,然后挂钩到警报的委托方法,当您从警报视图中获取回调时,运行另一个方法。

这样,在用户在流程第一部分的警报上按 OK 之前,流程的第二部分不会发生。

于 2009-03-19T18:58:18.737 回答