UIAlertAction的处理程序有点太迟了 – 我怎么能立即做到这一点?

我正在尝试(…)为添加到UIAlertController的button添加声音效果。 我在处理程序中发出了一个声音效果,但实际上有点太迟了。 声音像0.5秒太晚了。 警报即将解散 ,我希望声音能够解除,而不是解散之后解除。 使用UIAlertView可以处理使用alertWillDismiss …而不是alertDidDismiss。

我错过了什么?

不,你没有错过任何东西。 您正在查找的function不是由UIAlertController提供的。 考虑提供你自己的视图控制器,通过它你可以有很好的控制。

我使用了Patrick Goley的build议,即为UIAlertController创build子类并覆盖viewWillDisappear。 为我工作很好。

// // ImmediateClickAlertController.swift // // This subclass of UIAlertController plays a click immediately whenever it is dismissed (ie when a button is tapped). // This fixes an issue when trying to play a click in an attached UIAlertAction, which does not happen until after its view disappears. import AudioToolbox class ImmediateClickAlertController: UIAlertController { override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) // play a click let pressKeySystemSoundID: SystemSoundID = 1104 AudioServicesPlaySystemSound(pressKeySystemSoundID) } } 

有点唠叨,但也许你可以

  1. 尝试并获取对警报button的引用(通过遍历-admittedly专用视图层次树)和
  2. 使用KVO来检测对其selected和/或highlighted属性所做的任何更改(我自己的经验是selected的不可靠可见, highlighted )。

…但所有这些都非常脆弱,不够优雅,可能会在未来的操作系统版本中崩溃,并且/或者让您从应用程序商店被拒绝…?

所以你是最好的select(即使最费力)是推出你自己的模态视图控制器:

  • 苹果关于展示模态视图控制器的文档。

  • 我按照上面的文档(使用embedded式UIActivityIndicator定制的“ UIAlertController ”)进行的演示项目 – 在长时间的asynchronous过程中使用):