ios - 当工作表中的 scenePhase 发生变化时触发一个 Action

标签 ios swiftui

sheet 中的 scenePhase 发生变化时,如何触发 Action ?我尝试了 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
            }
    }
}

更新代码:

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

最佳答案

.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 !!
            }
    }
}

使用 Xcode 13.4/iOS 15.5 测试

关于ios - 当工作表中的 scenePhase 发生变化时触发一个 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72620039/

相关文章:

ios - 在iOS上生成高分辨率pdf

ios - 如何更改 TextField 的文本大小和字段大小?

swiftui - 有没有办法在swiftui中更改SF符号图标的笔触/填充颜色?

iphone - 在图库中显示一些缩放图像

ios - iOS 应用程序中的模型是否应该包含有关用于同步的 API 的信息?

ios - 如何在 iOS 11 中使用 NEDNSProxyProvider

ios - 将 CarPlay 添加到 SwiftUI 生命周期应用程序

SwiftUI上出现AVAudioPlayer播放多次

swift - 如何在 SwiftUI 上启用核心数据加密?

ios - 保存核心数据时出现问题