SwiftUI 通过点击外部来关闭警报

Ric*_*hiy 7 alert ios swift swiftui

UIKit 中的类似问题:How to dismiss UIAlertController when tap Outside the UIAlertController?

我有一个带有几个按钮的基本警报(取消/删除样式)。我想通过点击警报外部来“关闭”警报,类似于“取消”按钮的操作:

struct ContentView: View {
    @State private var showingAlert = false

    var body: some View {
        Button("Show Alert") {
            showingAlert = true
        }
        .alert("Important message", isPresented: $showingAlert) {
            Button("First") { }
            Button("Second") { }
            Button("Third") { }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试添加onTapGesture处理程序,但没有帮助。

小智 2

我不确定警报是否是您想要实现的目标的正确选择。警报并不打算按照您所描述的方式使用,并且通过点击外部来消除警报会给 iOS 上的用户体验带来尴尬,并且苹果不鼓励这样做。SwiftUI 旨在用于多个苹果平台,例如 AppleWatch 或 AppleTV,在这些平台上您无法简单地点击警报之外的地方。因此,SwiftUI 中没有实现您所描述的此类机制。

\n

更好的方法是创建您自己的视图并使用ZStack. 然后,您可以onTapGesture在任何可单击区域上使用修饰符来关闭视图。\n请查看示例以获取简化示例。

\n
struct ContentView: View {\n    @State private var showingAlert = false\n\n    var body: some View {\n        ZStack {\n            // green area is clickable\n            VStack {\n                Spacer()\n                HStack {\n                    Spacer()\n                    Button("Show Alert") {\n                                showingAlert = true\n                            }\n                    Spacer()\n                }\n               \n                Spacer()\n            }\n            .background(.green)\n            .onTapGesture {\n                self.showingAlert = false\n            }\n            \n            if(showingAlert) {\n                // your overlay to be designed by you. \n                VStack\xc2\xa0{\n                    Text("alert")\n                }\n                .frame(width: 100, height: 100, alignment: .center)\n                .background(.gray)\n            }\n        }\n       \n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n