只需一个操作按钮即可创建警报

Eva*_*n93 4 alert action swift swiftui swiftui-alert

我想要一个Alert可以运行一些代码的一键式按钮。我不希望有取消按钮。我只见过一种有两个按钮的方法,分别是primaryButtonsecondaryButton。有没有办法做这样的事情?

And*_*rew 9

在 SwiftUI 中创建警报时,文档是查看可用内容的好地方。

创建警报部分,我们看到以下内容:

init(title: Text, message: Text?, primaryButton: Alert.Button, secondaryButton: Alert.Button)

创建带有两个按钮的警报。

init(title: Text, message: Text?, dismissButton: Alert.Button?)

一键创建警报。

正如文档所述,要通过一个按钮创建警报,您可以选择第二个选项。

您可以在警报中使用四种不同的按钮类型,请参阅此处

static func cancel((() -> Void)?) -> Alert.Button

指示取消的警报按钮。

static func cancel(Text, action: (() -> Void)?) -> Alert.Button

创建一个 Alert.Button 来指示取消某些操作。

static func default(Text, action: (() -> Void)?) -> Alert.Button

创建具有默认样式的 Alert.Button。

static func destructive(Text, action: (() -> Void)?) -> Alert.Button

创建一个 Alert.Button,其样式指示某些数据的破坏。

因此,根据您希望按钮执行的操作,有很多选项可供选择。请注意,对按钮执行操作是可选的。所以基本上你可以让你的按钮在点击时执行某些操作或不执行任何操作。


没有任何操作的警报

这三个警报产生的内容是相同的。

Alert(title: Text("Alert Title"), message: Text("Alert message"), dismissButton: .default(Text("OK")))

Alert(title: Text("Alert Title"), message: Text("Alert message"), dismissButton: .default(Text("OK"), action: nil))

Alert(title: Text("Alert Title"), message: Text("Alert message"), dismissButton: .default(Text("OK"), action: {}))
Run Code Online (Sandbox Code Playgroud)

因为 action 是可选的,并且它的默认值为 nil,所以我们可以省略、传递 nil,或者传递一个空闭包。第一个选项是如果我不执行某项操作我会选择的选项。


带有操作的警报

如果我们想要执行一个操作,我们只需将其包含在操作参数中即可。我们可以将所有代码编写在我们传递的闭包中,也可以将其编写为函数。

此警报包含在点击包含在闭包中的操作时应运行的代码。如果您要运行一行代码,这没有问题,但如果您有多行代码,它可能会开始混乱您的视图。

Alert(title: Text("Alert Title"),
      message: Text("Alert message"),
      dismissButton: .default(Text("OK"), action: { print("Hello")}))
Run Code Online (Sandbox Code Playgroud)

此警报的操作依赖于已在 ContentView 中声明的函数。这意味着非常复杂的函数不会使您的视图代码变得混乱。

struct ContentView: View {

    @State private var showAlert: Bool = false

    var body: some View {
        Button(action: { self.showAlert.toggle() },
               label: { Text("Show Alert") })
        .alert(isPresented: $showAlert, content: {
            Alert(title: Text("Alert Title"),
                  message: Text("Alert message"),
                  dismissButton: .default(Text("OK"), action: self.hello))
        })
    }

    func hello() {
        print("Hello")
    }
}
Run Code Online (Sandbox Code Playgroud)