当工作表中的 scenePhase 发生变化时触发操作

Faw*_*fai 4 ios swiftui

scenePhase当a 发生变化时如何触发操作sheet?我尝试了onChange修改器,但当应用程序进入后台时它不会触发。

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .sheet(isPresented: .constant(true), content: SheetView.init)
    }
}

struct SheetView: View {
    @Environment (\.scenePhase) private var scenePhase
    @State private var isFolderLocked = true
    var body: some View {
        Text("Hello, world!")
            .onAppear {
                print("view appeared.")
                // if folder is locked, authenticate and unlock it
            }
            .onChange(of: scenePhase) { newValue in
                print("scenePhase changed.")
                // if scenePhase == .background, lock folder
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新的代码:

import SwiftUI

struct ContentView: View {
    @Environment (\.scenePhase) private var scenePhase
    var body: some View {
        Text("Hello, world!")
            .sheet(isPresented: .constant(true)) {
                SheetView()
                    .environment(\.scenePhase, scenePhase)
            }
    }
}

struct SheetView: View {
    @Environment (\.scenePhase) private var scenePhase
    var body: some View {
        NavigationView {
            NavigationLink("Show FirstDetailsView") {
                FirstDetailsView()
                    .environment(\.scenePhase, scenePhase)
            }
        }
    }
}

struct FirstDetailsView: View {
    @Environment (\.scenePhase) private var scenePhase
    var body: some View {
        NavigationLink("Show SecondDetailsView") {
            SecondDetailsView()
                .environment(\.scenePhase, scenePhase)
        }
        .onChange(of: scenePhase) { _ in
            print("scenePhase changed.")
        }
    }
}

struct SecondDetailsView: View {
    @Environment (\.scenePhase) private var scenePhase
    var body: some View {
        Text("This is SecondDetailsView")
    }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 8

.sheet 修饰符引入了新的演示文稿,并且环境不会自动复制到那里。我们必须明确地这样做,例如

struct ContentView: View {
    @Environment (\.scenePhase) private var scenePhase
    var body: some View {
        Text("Hello, world!")
            .sheet(isPresented: .constant(true)) {
                SheetView()
                  .environment(\.scenePhase, scenePhase)   // << here !!
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 Xcode 13.4 / iOS 15.5 进行测试