ios - Swift 错误“UIButton.currentTitle 必须仅在主线程中使用”
问题描述
我刚刚从以下链接遵循了这个你管教程:
网址:https ://www.youtube.com/watch?v=aiXvvL1wNUc
我遇到一个错误,说“UIButton.currentTitle 只能从主线程使用”
不太清楚如何解决这个问题,因为我是制作应用程序的新手,有人可以帮助我吗?
非常感谢并提前感谢!
import UIKit
import MediaPlayer
class GenreButtonScreen: UIViewController {
var musicPlayer = MPMusicPlayerController.applicationMusicPlayer
@IBAction func genreButtonTapped(_ sender: UIButton) {
MPMediaLibrary.requestAuthorization { (status) in
if status == .authorized {
self.playGenre(genre: sender.currentTitle!)
}
}
}
@IBAction func stopButtonTapped(_ sender: UIButton) {
musicPlayer.stop()
}
@IBAction func nextButtonTapped(_ sender: UIButton) {
musicPlayer.skipToNextItem()
}
func playGenre(genre:String) {
musicPlayer.stop()
let query = MPMediaQuery()
let predicate = MPMediaPropertyPredicate(value: genre, forProperty: MPMediaItemPropertyGenre)
query .addFilterPredicate(predicate)
musicPlayer.setQueue(with: query)
musicPlayer.shuffleMode = .songs
musicPlayer.play()
}
}
解决方案
MPMediaLibrary.requestAuthorization 是异步调用,布局组件只能在主线程中修改。你应该使用这种方式:
MPMediaLibrary.requestAuthorization { (status) in
if status == .authorized {
DispatchQueue.main.async {
self.playGenre(genre: sender.currentTitle ?? String())
}
}
}
推荐阅读
- html - 解码 Html 实体
- python - 有没有办法检查 PyQt5 窗口是否打开并相应地延迟另一个实例?
- xml - 是否可以为 VS Code 中的某些 XML 标签分配不同的颜色?
- ios - 使用 url 方案将 .ovpn 配置文件从 iOS 应用程序发送到官方 openVPN 客户端
- apache-spark - 从包含大量文件的 s3 存储桶读取时,AWS Glue 作业在 create_dynamic_frame_from_options 失败
- ssh - 如何从 drud/ddev-ssh-agent 容器中删除密钥?
- android - 如何通过 firebase curl 发送短信
- r - 根据数据框的两个变量给出排名
- c++ - 像“>>,<<”这样的运算符重载不起作用
- elasticsearch - Logstash 重复事件