【问题标题】:Run UIAlertController Completion Handler Block Before Dismiss Animation在关闭动画之前运行 UIAlertController 完成处理程序块
【发布时间】:2018-04-05 23:56:05
【问题描述】:

我正在使用UIAlertController 设置一个非常标准的操作表:

    let alert = UIAlertController(title: "title",
                                  message: nil,
                                  preferredStyle: .actionSheet)

    alert.addAction(
        UIAlertAction(title: "button",
                      style: .default,
                      handler: { _ in
                        MediaPlayer.playSound(.click)
                        // The above line just uses AVAudioPlayer to play
                        // an MP3 file. Its implementation isn't relevant
                        // to the question and can be assumed to be correct.
    }))

当我按下按钮时,警报消失,然后完成处理程序运行并播放声音。由于警报的关闭动画需要一段时间,因此在我按下按钮和播放声音之间存在非常明显的延迟;当声音开始时,警报甚至不再可见。

有没有办法在按下按钮后立即播放声音,而不是等到关闭动画完成?

此外,有没有一个简单的方法可以做到这一点? IE。 Apple 是否反对人们在警报按钮上添加点击声音?

【问题讨论】:

  • 不,在调用警报操作处理程序时无法更改。
  • 那么当用户点击警报按钮时基本上不可能播放声音?
  • 可能。处理程序并不意味着在点击按钮的纳秒内运行。这是为了告诉您警报已被解除,并告诉您点击了哪个按钮。

标签: ios swift cocoa-touch uialertcontroller


【解决方案1】:

您基本上无能为力。 UIAlertController 替换 UIAlertView 后,用户点击和按钮操作处理程序运行之间的延迟就很明显了:

UIAlertController dismiss is slow

实际上,您正在尝试做 Apple 不希望您做的事情,即将声音与警报控制器按钮相关联。

我对这类事情的解决方案很简单:不要使用 UIAlertController。构建一个自定义的呈现视图控制器非常容易,它看起来只是类似于 UIAlertController 的视图,而实际上 UIAlertController 呈现的视图控制器。所以就自己动手吧。现在按钮是你的了,你可以检测到点击并发出声音然后关闭,没问题。

【讨论】:

    【解决方案2】:

    我建议不要像马特建议的那样重建UIAlertController(并在每次调整时更新它以匹配iOS),我建议只是将其子类化。你可以给它一个你想在它消失时运行的代码块。例如:

    class CustomAlertController: UIAlertController {
        var onDisappear: (() -> Void)?
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewDidDisappear(animated)
    
            onDisappear?()
        }
    }
    

    然后您可以在显示警报控制器之前设置此块:

    let controller = CustomAlertController(title: "Title", message: nil, preferredStyle: .actionSheet)
    controller.onDisappear = {
        // play sound here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多