我正在使用Spotify APK授权与Spotify应用的连接。与Spotify的所有通信都是通过Scene Delegate完成的。我的问题是,当我要求授权并被带入和移出Spotify应用程序时,当前视图似乎停止使用@Published变量更改来更新。但是,我希望视图在成功授权/连接后发生变化。
我尝试过对MainView进行更新,并对不同的变量进行不同的更改,但是看来,无论我做什么,一旦应用离开并重新进入前台,视图就会停止对已发布的变量进行更改。
SceneDelegate:
class SceneDelegate: UIResponder, UIWindowSceneDelegate, SPTAppRemoteDelegate, SPTAppRemotePlayerStateDelegate {
@ObservedObject var MainVM = MainViewModel()
func appRemoteDidEstablishConnection(_ appRemote: SPTAppRemote) {
MainVM.viewSwitch = false
}
}
MainViewModel:
class MainViewModel: ObservableObject {
@Published var viewSwitch: Bool = true
var appRemote: SPTAppRemote {
get {
let scene = UIApplication.shared.connectedScenes.first
let sd : SceneDelegate = (scene?.delegate as? SceneDelegate)!
return sd.appRemote
}
}
func connectAppRemote() {
appRemote.authorizeAndPlayURI("")
}
}
MainView:
struct MainView: View {
@ObservedObject var MainVM = MainViewModel()
var body: some View {
if MainVM.viewSwitch {
Text("View 1 Displayed")
} else {
Text("View 2 Displayed")
}
}
.onAppear {
MainVM.connectAppRemote()
}
}
答案 0 :(得分:1)
您使用不同的对象:
A。 SceneDelegate
有自己的实例(顺便说一句,这里不需要ObservedObject
)
class SceneDelegate: UIResponder, UIWindowSceneDelegate,
SPTAppRemoteDelegate, SPTAppRemotePlayerStateDelegate {
@ObservedObject var MainVM = MainViewModel()
和
B。 MainView
有自己的
struct MainView: View {
@ObservedObject var MainVM = MainViewModel() // << recreated
您需要将SceneDelegate
中的那个作为environmentObject
中的MainView
传递,就像
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
let contentView = MainView().environmentObject(MainVM)
并进行相应声明
struct MainView: View {
@EnvironmentObject var MainVM: MainViewModel