swift - 从场景委托更新视图控制器中的变量的最佳方法是什么?
问题描述
我正在使用 Spotify SDK。当用户更改他/她的播放器状态时,我想更改某些视图控制器中的标签。这是我的场景委托:
var playerViewController = MatchViewController()
func playerStateDidChange(_ playerState: SPTAppRemotePlayerState) {
playerViewController.stateChanged(playerState)
}
视图控制器:
func stateChanged(_ playerState: SPTAppRemotePlayerState) {
// aLabel.text = playerState.track.name
}
问题是当状态改变时标签或其他出口为零,因为当时没有加载视图控制器。我该如何解决?(我试过isViewLoaded)
解决方案
如果您有多个地方要根据一个地方发生的变化进行更新,请使用观察者。就是这样,
在 SceneDelegate 中发布通知,如下所示:
func playerStateDidChange(_ playerState: SPTAppRemotePlayerState) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "stateChanged"), object: nil, userInfo: ["playerState": playerState])
}
像这样在 ViewControllers 中观察:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(stateChanged), name: NSNotification.Name("stateChanged"), object: nil)
}
@objc func stateChanged(_ notification: Notification) {
if let playerState = notification.userInfo?["playerState"] as? SPTAppRemotePlayerState {
print(playerState)
}
}
}
推荐阅读
- google-apps-script - 并排创建两个文本框/下拉菜单 Google App Script [Gmail Add-on]
- swift - 无法解决线程 1:致命错误:索引超出范围
- c - 将简单的哈希函数从 c 转换为 go
- vue.js - 我在哪里放置我的视图数据?
- mysql - 如何在 MySQL 的特定日期每 3 小时获取一次聚合结果?
- rust - 无法使用 cargo uninstall 卸载 ~/.cargo 中的包:包 id 规范匹配没有包
- laravel - laravel 5.6 和 apache 为 url 提供 404
- javascript - Electron 中的调试:如何从控制台访问渲染范围对象?
- vba - 如何在不使用 VBA 的情况下对 Excel 工作表中的 CAS 编号执行数据验证?
- python - Python用字符串变量定义文件名,包括'\'