SwiftUI .onAppear, hanya berjalan sekali

Aug 15 2020

Di SwiftUIaplikasi saya memiliki kode seperti ini:

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

Masalah saya adalah saya ingin menjalankan beberapa kode di dalam blok .onAppear , sehingga dapat dijalankan ketika aplikasi muncul di layar, setelah diluncurkan atau setelah berada di latar belakang untuk sementara waktu. Tapi sepertinya kode ini hanya dijalankan sekali saat peluncuran aplikasi, dan tidak pernah setelahnya. Apakah saya melewatkan sesuatu? Atau haruskah saya menggunakan strategi lain untuk mendapatkan hasil yang saya inginkan?

Jawaban

5 Frankenstein Aug 15 2020 at 15:46

Anda harus mengamati acara ketika aplikasi sedang memasuki latar depan dan mempublikasikannya menggunakan @Publishedke ContentView. Begini caranya:

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