scenePhaseを使うとバックグラウンドになった時に通知されるのだが、Modal Viewが表示されているときは呼び出されなかった。
struct MessageView: View { @Environment(\.scenePhase) private var scenePhase @Binding var isPresented: Bool var body: some View { Text("バックグラウンドになると閉じます.") .onChange(of: scenePhase) { newPhase in switch(newPhase) { case .inactive, .background: isPresented = false default: break } } } } struct ContentView: View { @State var isPresented = false var body: some View { VStack { Button("メッセージ表示") { isPresented = true } } .fullScreenCover(isPresented: $isPresented) { MessageView(isPresented: $isPresented) } .padding() } }
恐らくscenePhaseはWindow毎にEnvironment属性でセットされていてModal Viewではセットされていないのだろう。
Modal ViewにscenePhaseを渡して通知される様になった。
struct ContentView: View { @Environment(\.scenePhase) private var scenePhase @State var isPresented = false var body: some View { VStack { Button("メッセージ表示") { isPresented = true } } .fullScreenCover(isPresented: $isPresented) { MessageView(isPresented: $isPresented) .environment(\.scenePhase, scenePhase) } .padding() } }
MessageView()を表示してから、Home画面にもどると元の画面に戻っている。