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

时间:2020-07-16 04:12:06

标签: swift swiftui action alert swiftui-alert

我想要一个带有一个运行某些代码的按钮的Alert。我不希望有一个取消按钮。我只看到了一种使用两个按钮的方法,分别是primaryButtonsecondaryButton。有没有办法做这样的事情?

2 个答案:

答案 0 :(得分:1)

在SwiftUI中创建警报时,documentation是查看您可以使用的工具的好地方。

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

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

使用两个按钮创建警报。

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

通过一个按钮创建警报。

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

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

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

因为action是可选的,并且其默认值为nil,所以我们可以省略,传递nil或传递空闭包。第一种选择是,如果我不执行操作,该怎么做。


有动作的警报

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

此警报包含在闭合中点按操作时应运行的代码。如果只运行一行代码,这是可以的,但是如果有多行代码,它可能会开始使视图混乱。

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")
    }
}

答案 1 :(得分:0)

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

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