SwiftUI .onAppear ทำงานเพียงครั้งเดียว

Aug 15 2020

ในSwiftUIแอปฉันมีรหัสดังนี้:

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

ปัญหาของฉันคือฉันต้องการเรียกใช้โค้ดภายในบล็อก. onAppearเพื่อให้มันทำงานเมื่อแอปปรากฏบนหน้าจอหลังจากเปิดตัวหรือหลังจากอยู่ในพื้นหลังสักพัก แต่ดูเหมือนว่าโค้ดนี้จะทำงานเพียงครั้งเดียวเมื่อเปิดแอปและไม่หลังจากนั้น ฉันพลาดอะไรไปรึเปล่า? หรือฉันควรใช้กลยุทธ์อื่นเพื่อให้ได้ผลลัพธ์ที่ต้องการ?

คำตอบ

5 Frankenstein Aug 15 2020 at 15:46

คุณจะต้องสังเกตเหตุการณ์เมื่อแอปเข้าสู่เบื้องหน้าและเผยแพร่โดยใช้@Publishedไฟล์ContentView. วิธีการมีดังนี้

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