【问题标题】:SwiftUI: How to show an alert after a sheet is closed?SwiftUI:如何在工作表关闭后显示警报?
【发布时间】:2020-09-19 11:41:02
【问题描述】:

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

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

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

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

[Presentation] 尝试呈现 开启 TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier_: 0x7fbbaa60b7d0>(从 TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier_: 0x7fbbaa60b7d0>) 已经呈现 TtGC7SwiftUI22SheetHostingControllerVS_7AnyView: 0x7fbbaa413200>.

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    您可以使用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"))
            }
        }
    }
    
    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"))
            }
        }
    }
    

    【讨论】:

    • :( 这两种方法似乎都不适用于 WatchOS (7.4)
    • 没关系,看起来我在祖先视图中有一个警报修饰符,它阻止了我的预期警报。 (这个错误真的需要在 SwiftUI 中修复)
    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多