SwiftUI .onAppear, wird nur einmal ausgeführt

Aug 15 2020

In einer SwiftUIApp habe ich folgenden Code:

var body: some View {
    VStack {
        Spacer()
        ........
    }
    .onAppear {
      .... I want to have some code here ....
      .... to run when the view appears ....
    }
}

Mein Problem ist, dass ich Code im .onAppear- Block ausführen möchte , damit er ausgeführt wird, wenn die App nach dem Start oder nach einer Weile im Hintergrund auf dem Bildschirm angezeigt wird. Es scheint jedoch, dass dieser Code beim Start der App nur einmal und danach nie mehr ausgeführt wird. Vermisse ich etwas Oder sollte ich eine andere Strategie anwenden, um das gewünschte Ergebnis zu erzielen?

Antworten

5 Frankenstein Aug 15 2020 at 15:46

Sie müssten das Ereignis beobachten, wenn die App in den Vordergrund tritt, und es mit @Publisheddem veröffentlichen ContentView. Hier ist wie:

struct ContentView: View {

    @ObservedObject var observer = Observer()

    var body: some View {
        VStack {
            Spacer()
            //...
        }
        .onReceive(self.observer.$enteredForeground) { _ in
            print("App entered foreground!") // do stuff here
        }
    }
}

class Observer: ObservableObject {

    @Published var enteredForeground = true

    init() {
        if #available(iOS 13.0, *) {
            NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIScene.willEnterForegroundNotification, object: nil)
        } else {
            NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
        }
    }

    @objc func willEnterForeground() {
        enteredForeground.toggle()
    }
}