SwiftUI:如何在工作表关闭后显示警报?

G. *_*arc 2 swiftui

我正在尝试显示由模式表触发的警报。这是一个小的演示项目:

import SwiftUI

struct ContentView: View {
    @State private var showSheet = false
    @State private var showAlert = false

    var body: some View {
        Button("Press") {
            showSheet = true
        }
        .sheet(isPresented: $showSheet) {
            Button("Close with alert") {
                showSheet = false
                showAlert = true
            }
        }
        .alert(isPresented: $showAlert) {
            Alert(title: Text("Alert"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

单击“按下”按钮后,会出现一个带有“关闭警报”按钮的模式表。如果按下此按钮,工作表将关闭并且没有任何反应。我希望显示警报。

似乎隐藏工作表的动画导致了这个问题,因为在设置 showSheet = false 后,SwiftUI 似乎并不认为工作表已关闭。出现以下警告支持该理论:

[演示]尝试本<SwiftUI.PlatformAlertController:0x7fbbab012200>上< TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier _:0x7fbbaa60b7d0>(距离< TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier _:0x7fbbaa60b7d0>),其已经呈现< TtGC7SwiftUI22SheetHostingControllerVS_7AnyView:0x7fbbaa413200>。

paw*_*222 6

您可以使用onDismiss.

以下是一些基于您希望何时显示警报的示例:

  1. 总是以警告结束:
struct ContentView: View {
    @State private var showSheet = false
    @State private var showAlert = false

    var body: some View {
        Button("Press") {
            showSheet = true
        }
        .sheet(isPresented: $showSheet, onDismiss: {
            showAlert = true
        }) {
            Button("Close") {
                showSheet = false
            }
        }
        .alert(isPresented: $showAlert) {
            Alert(title: Text("Alert"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 按钮单击时关闭警报:
struct ContentView: View {
    @State private var showSheet = false
    @State private var showAlert = false
    @State private var closeSheetWithAlert = false

    var body: some View {
        Button("Press") {
            showSheet = true
            closeSheetWithAlert = false
        }
        .sheet(isPresented: $showSheet, onDismiss: {
            showAlert = closeSheetWithAlert
        }) {
            Button("Close") {
                closeSheetWithAlert = true
                showSheet = false
            }
        }
        .alert(isPresented: $showAlert) {
            Alert(title: Text("Alert"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)