首页 > 解决方案 > 从场景委托更新视图控制器中的变量的最佳方法是什么?

问题描述

我正在使用 Spotify SDK。当用户更改他/她的播放器状态时,我想更改某些视图控制器中的标签。这是我的场景委托:

var playerViewController = MatchViewController()

func playerStateDidChange(_ playerState: SPTAppRemotePlayerState) {
    playerViewController.stateChanged(playerState)
}

视图控制器:

func stateChanged(_ playerState: SPTAppRemotePlayerState) {
    // aLabel.text = playerState.track.name
}

问题是当状态改变时标签或其他出口为零,因为当时没有加载视图控制器。我该如何解决?(我试过isViewLoaded)

标签: swift

解决方案


如果您有多个地方要根据一个地方发生的变化进行更新,请使用观察者。就是这样,

在 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)
        }
    }
}

推荐阅读