UIAlertAction 的处理程序有点太晚了——我怎样才能让它立即生效?
Posted
技术标签:
【中文标题】UIAlertAction 的处理程序有点太晚了——我怎样才能让它立即生效?【英文标题】:The handler of a UIAlertAction is a bit too late - how can I make it immediate? 【发布时间】:2016-02-17 03:34:20 【问题描述】:我正在尝试 (...) 为添加到 UIAlertController 的按钮添加声音效果。我在处理程序中发出声音效果,但这实际上有点太晚了。声音像 0.5 秒一样迟到了。我希望在警报即将解除时立即发出声音,而不是在它解除后。使用 UIAlertView 可以使用 alertWillDismiss... 而不是 alertDidDismiss 来处理。
我错过了什么吗?
【问题讨论】:
相关***.com/questions/32441856/… 如果您认为自己的用例很好,请向 Apple 提交错误报告! 我试图登录到 bugreport.apple.com,但我得到的只是 发生了错误。如需访问 Apple Bug Reporter 的帮助,请联系 Apple 开发者计划支持。 我想我一般都被讨厌了。或者我们所有人都是。 我认为他们没有添加这个功能是因为这个问题:***.com/questions/25932589/… - 如果前一个还没有完全关闭,处理程序将无法打开另一个 uialertcontroller -如果使用相同的 uiviewcontroller 打开两个警报。只是我的假设。 【参考方案1】:不,你没有错过任何东西。 UIAlertController 不提供您正在寻找的功能。考虑提供您自己的呈现视图控制器,您将拥有您所追求的那种精细控制。
【讨论】:
值得注意的是,子类化 UIAlertController 并覆盖 viewWillDisappear 可能很容易,但将来这个类可能会成为最终类【参考方案2】:我使用了 Patrick Goley 的建议,即继承 UIAlertController 并覆盖 viewWillDisappear。对我来说效果很好。
//
// ImmediateClickAlertController.swift
//
// This subclass of UIAlertController plays a click immediately whenever it is dismissed (i.e. 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)
【讨论】:
【参考方案3】:有点骇人听闻,但也许你可以:
-
尝试获取对警报按钮的引用(通过遍历 -admittedly private-view 层次结构树),然后
使用 KVO 检测其
selected
和/或highlighted
属性的任何更改(我自己的经验是selected
不能可靠地观察到,而highlighted
是)。
...但是所有这些都非常脆弱,不够优雅,可能会在操作系统的未来版本中中断和/或让您被应用商店拒绝...?
所以你最好的选择(即使最费力)是滚动你自己的模态视图控制器:
Apple's documentation on presenting modal view controllers.
Demo project I made 遵循上述文档(自定义“UIAlertController
外观相似”,嵌入了 UIActivityIndicator
- 用于长时间的异步流程):
【讨论】:
以上是关于UIAlertAction 的处理程序有点太晚了——我怎样才能让它立即生效?的主要内容,如果未能解决你的问题,请参考以下文章