【问题标题】:Programmatically dismissing a UIAlertView on iOS 5 doesn't call didDismiss delegate method在 iOS 5 上以编程方式关闭 UIAlertView 不会调用 didDismiss 委托方法
【发布时间】:2011-10-13 04:48:49
【问题描述】:

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

【问题讨论】:

    标签: iphone ipad uialertview ios5


    【解决方案1】:

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

    - (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 对象的委托仅在用户执行操作时被调用。 Apple 假设当您使用代码执行某项操作时,您已经知道自己在做什么,并且不需要通知您。这适用于所有委托(UIScrollView 的滚动委托方法与代码滚动、表格视图操作……)
      无论如何,应该使用什么按钮索引来调用代理?.. 当您以编程方式关闭时,没有人

      【讨论】:

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

      根据Why doesn't dismissWithClickedButtonIndex ever call clickedButtonAtIndex?,问题是正在调用不同的方法。但是,这并不能解释为什么您会收到 不稳定的 电话。在我测试的设备上,dismiss 方法被正确调用,所以我只将它重定向到点击版本。

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

      【讨论】:

        【解决方案4】:

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

        通过dismissWithClickedButtonIndex:animated: 以消除警报的程序调用似乎没有调用alertView:clickedButtonAtIndex:

        因此,如果您需要在关闭警报视图时始终触发某些行为(无论是由用户点击按钮触发还是以编程方式触发),那么使用 didDismissWithButtonIndex:willDismissWithButtonIndex: 更有意义.

        【讨论】:

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