ios - 以编程方式启用按钮需要几秒钟

标签 ios swift avfoundation avaudioplayernode

我正在使用 AVFoundation 和 AVAudioPlayerNode 创建一个 swift 应用程序。我在播放时禁用播放按钮,并在播放器的完成部分启用它,但该按钮保持透明超过 10 秒。 该按钮可用,我的 print("complete") 立即显示,因此 View 似乎没有更新。这是我的代码:

player.scheduleBuffer(buffer, completionHandler: {              
            print("complete")
            self.playButton.enabled = true
            }
        )

我尝试了以下方法,但没有成功:

self.view.layoutIfNeeded()
player.scheduleBuffer(buffer, completionHandler: {
            print("complete")
            self.playButton.enabled = true
            self.playButton.reloadInputViews()
            self.view.layoutIfNeeded()
            }
        )

最佳答案

这可能是因为没有在负责更新 UI 的主线程上调用完成处理程序。

检查完成处理程序是否在主线程上运行,如果没有,则添加负责在主线程上更新 UI 的代码

为了快速检查 UI 没有立即更新的原因,试试这个,将代码放在完成处理程序中:

NSOperationQueue.mainQueue().addOperationWithBlock({
       print("complete")
        self.playButton.enabled = true
        self.playButton.reloadInputViews()
        self.view.layoutIfNeeded()
    })

检查代码是否在主线程上运行可以像这样快速完成:

print(NSThread.isMainThread())

我假设你在寻找解决方案时放置了 layoutIfNeeded,没有更大的上下文我不能 100% 肯定地说但可能你不需要它

关于ios - 以编程方式启用按钮需要几秒钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34499433/

相关文章:

ios - 使用 swift 在 IOS 应用程序中制作下拉菜单

ios - iOS App 排行榜虚报大分

php - iOS 应用程序与 Laravel webapp 通信

ios - 如果我们从 segue 获取数据,如何在填写文本字段后启用按钮

swift - 如何从另一个 ViewController 更改标签颜色? swift

swift - 通过 AVAudioRecorder 在 WatchOS 上录制音频

ios - AVAssetWriter 如何写入降采样/压缩的 m4a/mp3 文件

ios - 为什么我不能在动态输入 block 中使用 BOOL 变量?

xcode - Swift:当单击具有相同标签的按钮时更改 UISwitch 状态

ios - 如何确定CoreFoundation _CFXNotificationPost崩溃