【问题标题】:UIAlertAction handler running after delayUIAlertAction 处理程序延迟后运行
【发布时间】:2015-09-07 15:18:57
【问题描述】:

我正在尝试将我的 UIAlertViews 更改为 UIAlertControllers。我为它设置了这个动作:

UIAlertAction *undoStopAction = [UIAlertAction actionWithTitle:@"Undo Stop"
                                                        style:UIAlertActionStyleDefault
                                                       handler:^(UIAlertAction *action) {
                                                           [self undoStop];
                                                       }];

但是,处理程序直到操作被点击后大约一秒钟才会运行。有什么办法可以加快速度吗?

【问题讨论】:

  • 你在主线程上做点什么吗?
  • 或者你是在后台方法/块中运行它
  • 如果您没有使用主线程显示警报,请在主线程中执行。
  • 一切都来自主线程。
  • 这不是关于undoStop,因为我已经用单个NSLog替换了该行,并且延迟是相同的。即使从主控制器的 viewDidLoad 调用它,它仍然会发生。似乎 UIAlertAction 的处理程序总是被延迟。

标签: ios objective-c uialertview uialertcontroller uialertaction


【解决方案1】:

警报视图的短暂延迟是正常的(不过不到一秒)。如果这对您不方便,您可以通过编程方式创建一个带有标签和按钮的覆盖屏幕的视图,基本上是自定义的警报视图。

【讨论】:

  • 谢谢。我以前将它作为 UIAlertView,在点击艺术按钮时具有特定的行为。那一直都是即时的。我想我现在会继续这样做,即使它已被弃用。
【解决方案2】:

这里有一个半解决方案:

The handler of a UIAlertAction is a bit too late - how can I make it immediate?

基本上,子类化警报控制器并在 viewWillDisappear 上运行处理程序。您可以将处理程序块存储在警报控制器上。

此解决方案的问题在于,如果您使用 UIAlertAction 添加操作,则无法像您那样为每个按钮运行处理程序。所以这是一个主要的限制。

但是,这个解决方案对我有用(因为我试图在警报出现时在警报后面添加一个背景视图,并在警报消失时让它随着警报消失......最初我试图用按钮点击,但由于处理程序被延迟,这不起作用)。

【讨论】:

    【解决方案3】:

    正如 T 先生留下的评论所暗示的那样,处理程序可能没有在主线程上被调用,这可以解释延迟。尝试将您的处理程序代码嵌入:

    dispatch_async(dispatch_get_main_queue()) {
    <your code>
    }
    

    看看你是否仍然得到延迟。

    【讨论】:

    • 没有变化。似乎处理程序直到一秒钟后才执行。与我使用 UIAlertView 时的情况不同
    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多