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 的处理程序有点太晚了——我怎样才能让它立即生效?的主要内容,如果未能解决你的问题,请参考以下文章

昨天太晚了,今天教你用Debug模式来分析程序执行顺序

28岁自学编程会不会太晚了?靠谱吗?

Java市场饱和了吗?现在转行学习Java会不会太晚了?

VueJS 执行数据函数太晚了(?)

TextBox 和默认 Button 绑定确实更新得太晚了

MutationObserver 的 DOM 上下文丢失了,因为它触发得太晚了