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)
.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 进行测试
| 归档时间: |
|
| 查看次数: |
763 次 |
| 最近记录: |