当应用程序进入后台时,SwiftUI View停止更新

时间:2019-12-25 03:46:42

标签: ios swift xcode swiftui

我正在使用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()
    }
}

1 个答案:

答案 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
相关问题