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

Create an Alert with just one action button

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

虽然有点违反直觉,但您可以将 dismissButton 参数用于任何按钮样式,而不仅仅是 .cancel()

Alert(title: Text("Title"), message: Text("Message"), dismissButton: .default(Text("Run Code"), action: { 
    // code
}))

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

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

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

Creates an alert with two buttons.

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

Creates an alert with one button.

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

您可以在警报中使用四种不同的按钮类型,see here

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

An alert button that indicates cancellation.

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

Creates an Alert.Button that indicates cancellation of some operation.

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

Creates an Alert.Button with the default style.

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

Creates an Alert.Button with a style indicating destruction of some data.

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


无操作的警报

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

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: {}))

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


带有操作的警报

如果我们想要执行一个动作,我们只需要将它包含在动作参数中。我们可以将所有代码都写在我们传递的闭包中,也可以将它写成一个函数。

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

Alert(title: Text("Alert Title"),
      message: Text("Alert message"),
      dismissButton: .default(Text("OK"), action: { print("Hello")}))

此警报的操作依赖于已在 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")
    }
}