以编程方式启用按钮需要几秒钟
programmatically enabling buttons taking several seconds
我正在使用 AVFoundation 和 AVAudioPlayerNode 创建一个 swift 应用程序。我在播放时禁用播放按钮,并在播放器的完成部分启用它,但该按钮保持透明超过 10 秒。
该按钮可用,我的 print("complete") 立即显示,因此视图似乎没有更新。这是我的代码:
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()
})
检查主线程上的代码是否 运行 可以在 swift 中完成,例如:
print(NSThread.isMainThread())
我假设你在寻找解决方案时放置了 layoutIfNeeded
,没有更大的上下文我不能 100% 肯定地说但可能你不需要它
完成处理程序不在主线程中。您可以使用以下代码移动该部分代码:
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})
我正在使用 AVFoundation 和 AVAudioPlayerNode 创建一个 swift 应用程序。我在播放时禁用播放按钮,并在播放器的完成部分启用它,但该按钮保持透明超过 10 秒。 该按钮可用,我的 print("complete") 立即显示,因此视图似乎没有更新。这是我的代码:
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()
})
检查主线程上的代码是否 运行 可以在 swift 中完成,例如:
print(NSThread.isMainThread())
我假设你在寻找解决方案时放置了 layoutIfNeeded
,没有更大的上下文我不能 100% 肯定地说但可能你不需要它
完成处理程序不在主线程中。您可以使用以下代码移动该部分代码:
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})