【问题标题】:Bug in AlertView on iPhone?iPhone 上的 AlertView 中的错误?
【发布时间】:2009-03-19 12:12:14
【问题描述】:

我写了一段代码来“做某事->显示警报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”(Press 'OK')->“Alert 1”。为什么“警报 1”又出现了?我还没有写任何委托方法。也许是一个错误?(感谢 cobbal,当 alert2 出现时,alert1 仍然存在。)

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

【问题讨论】:

    标签: iphone objective-c alert


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。当 alert2 显示时,alert1 中的取消按钮被阻止。这让我没有时间点击它。委托方法是否总是用于显示多个警报视图?
    • 至少我没有看到任何其他方法
    • 有一种方法可以使 UIAlertView 模态显示,但它是一个私有方法
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多