如何向用户呈现警报?

How to present alert to User?

我想问一下如何向用户显示警报。 我刚试过:

.navigationBarItems(trailing: Button(action: {
      let alert = Alert(title: Text("Add category"), message: Text("Do you want add category?"), primaryButton: Alert.Button.default(Text("Yes"), onTrigger: {
           self.sceneries[0].sceneries.append(Scenery(name: "Name", imageName: "1"))
      }), secondaryButton: Alert.Button.cancel())
      self.presentation(self.$isShownAlert) { () -> Alert in
           return alert
      }
 }, label: {
      Text("Add category")
}))

但是它告诉我它没有被使用并且没有出现警报...

您需要在应显示警报的视图顶部调用 presentation API。

完成此操作的最佳方法是使用一个 @State 变量,它告诉 SwiftUI 是否应显示警报。

Button 操作然后将其设置为 true,从而使 body 无效并触发视图重建。

struct ContentView : View {

    @State var showAlert = false

    var body: some View {
        NavigationView {
            List(0...10) { value in
                Text(verbatim: "\(value)")
            }
            .navigationBarItems(leading: EmptyView(), trailing: Button(action: {
                self.showAlert = true
            }) {
                Text(verbatim: "Show alert")
            })
            .navigationBarTitle(Text(verbatim: "A List"))
        }
        .presentation($showAlert) {
            return Alert(title: Text(verbatim: "An Alert"))
        }
    }

}

在此示例中,按钮将 @State 设置为 true, presentation 在导航视图上被调用。

结果:

要使用两个按钮显示警报,您可以执行以下操作:

@State var showAlert = false

let alert = Alert(title: Text("Title"), message: Text("Alert message"),
  primaryButton: Alert.Button.default(Text("OK"), 
    onTrigger: {
      print("OK button tapped")
    }
  ), 
  secondaryButton: Alert.Button.cancel()
)

var body: some View {

  NavigationView {
    Text("Content")
      .navigationBarItems(trailing: Button(action: {
        self.showAlert = true
      }, label: {
        Text("Show Alert")
      }).presentation(self.$showAlert, alert: {
        return alert
      })
    )
  }
}

结果:

以上答案已被弃用。改用这个:

@State var showsAlert = false

var body: some View {
    NavigationView {
        List {
            Text("Item 1")
            Text("Item 2")
            Text("Item 3")
        }
        .navigationBarTitle("My List", displayMode: .inline)
        .navigationBarItems(trailing:
            Button(action: {
                self.showsAlert = true
            }, label: {
                Text("Show Alert")
            }).alert(isPresented: self.$showsAlert) {
                Alert(title: Text("Hello World"))
            }
        )
    }
}

注意使用 .alert 而不是 .presentation