SwiftUI:如何在关闭Sheet后显示警报?

6

我想展示一个由模态表单触发的警告。这是一个小的演示项目:

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”的按钮。如果按下此按钮,则关闭该模态框并什么也不会发生。我期望弹出警告信息。
似乎隐藏该模态框的动画导致了问题,因为SwiftUI在将showSheet设置为false后似乎并没有将该模态框视为已关闭。以下警告信息支持这一理论:
[Presentation] Attempt to present on <: 0x7fbbaa60b7d0> (from <: 0x7fbbaa60b7d0>) which is already presenting <: 0x7fbbaa413200>.
2个回答

9

您可以使用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)上似乎都不起作用。 - TealShift
1
算了,看起来我在祖先视图中有一个警报修饰符阻止了我的意图警报。(这个错误在SwiftUI中真的需要修复) - TealShift

0
你可以在表格中设置一个警报。
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"))
        }
    }
    
}

}


这个不起作用。在按下“关闭并警告”后,表格将会直接关闭。在所有后续的“按下”操作中,警告将立即出现。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接