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) } }
有点唠叨,但也许你可以 :
- 尝试并获取对警报button的引用(通过遍历-admittedly专用视图层次树)和
- 使用KVO来检测对其
selected
和/或highlighted
属性所做的任何更改(我自己的经验是selected
的不可靠可见,highlighted
)。
…但所有这些都非常脆弱,不够优雅,可能会在未来的操作系统版本中崩溃,并且/或者让您从应用程序商店被拒绝…?
所以你是最好的select(即使最费力)是推出你自己的模态视图控制器:
-
苹果关于展示模态视图控制器的文档。
-
我按照上面的文档(使用embedded式
UIActivityIndicator
定制的“UIAlertController
”)进行的演示项目 – 在长时间的asynchronous过程中使用):