首页 > 解决方案 > 提交工作表后显示警报

问题描述

我有一个 SwiftUI-View MyView,它在单击按钮时显示一个视图控制器。呈现的视图控制器(在 UIKit 中实现并通过UIViewControllerRepresentablein包装MyPresentedView )获得一个绑定以isShowingAlert指示错误情况,应在工作表关闭后通过显示警报来处理该错误情况。

struct MyView: View {
    @State private var isShowingSheet = false
    @State private var isShowingAlert = false

    var body: some View {
        Button(action: { self.isShowingSheet.toggle() }) {
            Text("Show Sheet")
        }
        .sheet(isPresented: $isShowingSheet) {
            MyPresentedView(alert: self.$isShowingAlert)
        }
        .alert(isPresented: $isShowingAlert) {
            Alert(title: Text("title"), message: Text("message"), dismissButton: .default(Text("OK")))
        }
    }
}

问题:由于呈现的视图控制器isShowingAlert在仍然呈现时切换,SwiftUI 似乎试图在表单仍然呈现时呈现警报。这会产生如下日志消息:

警告:尝试在已经呈现的 ... 上呈现 <SwiftUI.PlatformAlertController ...> (null)

有没有适当的方法来延迟.alert直到.sheet被解雇?

标签: swiftswiftui

解决方案


仅作记录,这是我在评论中提到的潜在解决方案的草图:

struct MyView: View {
    @State private var isShowingSheet   = false
    @State private var errorDuringSheet = false
    @State private var isShowingAlert   = false

    var body: some View {
        Button(action: { self.isShowingSheet.toggle() }) {
            Text("Show Sheet")
        }
        .sheet(isPresented: $isShowingSheet, onDismiss: propagateError) {
            MyPresentedView(alert: self.$errorDuringSheet)
        }
        .alert(isPresented: $isShowingAlert) {
            Alert(title: Text("title"), message: Text("message"), dismissButton: .default(Text("OK")))
        }
    }

    func propagateError() {
        isShowingAlert   = errorDuringSheet
        errorDuringSheet = false
    }
}

仍然欢迎任何更好的解决方案。


推荐阅读