在 SwiftUI 中,confirmationDialog() 是一种用于显示上下文菜单式对话框的方法,常用于提示用户选择、确认操作或提供额外选项。它以浮动菜单的形式显示,可以包含多个按钮以及一个可选标题和消息。
基本用法
confirmationDialog 需要绑定一个布尔值来控制其显示状态,同时需要提供一组按钮(Button)来定义可用选项。
基本示例
import SwiftUI
struct ContentView: View {
@State private var showDialog = false
@State private var selectedOption = ""
var body: some View {
VStack {
Text("Selected option: \(selectedOption)")
Button("Show Options") {
showDialog = true
}
.confirmationDialog("Choose an option", isPresented: $showDialog) {
Button("Option 1") {
selectedOption = "Option 1"
}
Button("Option 2") {
selectedOption = "Option 2"
}
Button("Cancel", role: .cancel) {}
} message: {
Text("Please choose an option below")
}
}
.padding()
}
}
效果
当点击按钮时,会显示一个上下文菜单,用户可以选择不同的选项。
role: .cancel 的按钮会自动以取消样式显示(通常在 iOS 上置于最底部,强调“取消”操作)。
参数说明
confirmationDialog 有多个重载形式,以下是常用形式及其参数:
形式 1:标题 + 按钮内容
confirmationDialog(
_ title: String,
isPresented: Binding<Bool>,
titleVisibility: Visibility = .automatic,
actions: @escaping () -> Buttons
)
title:对话框的标题,可以是字符串或其他 SwiftUI 视图。
isPresented:控制对话框显示的绑定布尔值。
titleVisibility:标题显示的策略:automatic、visible 或 hidden。
actions:提供一组按钮供用户选择。
形式 2:标题 + 消息 + 按钮内容
confirmationDialog(
_ title: String,
isPresented: Binding<Bool>,
titleVisibility: Visibility = .automatic,
@ViewBuilder actions: () -> Buttons,
@ViewBuilder message: () -> Message
)
message:可选消息,用于提供额外的上下文或提示内容。
按钮类型
在 confirmationDialog 中,按钮可以是多种类型,例如:
普通按钮
Button("Option 1") {
print("Option 1 selected")
}
取消按钮
Button("Cancel", role: .cancel) {}
取消按钮会自动以系统样式显示。
破坏性按钮
Button("Delete", role: .destructive) {
print("Item deleted")
}
破坏性按钮通常用于删除或危险操作,系统会自动应用红色样式。
高级用法
带自定义标题视图
confirmationDialog(
"",
isPresented: $showDialog,
titleVisibility: .visible
) {
Button("Option 1") { selectedOption = "Option 1" }
Button("Option 2") { selectedOption = "Option 2" }
Button("Cancel", role: .cancel) {}
} message: {
VStack {
Text("This is a custom title")
.font(.headline)
Text("Choose an option below")
.font(.subheadline)
}
}
动态生成按钮
通过动态内容创建按钮,例如使用 ForEach:
let options = ["Option 1", "Option 2", "Option 3"]
confirmationDialog("Choose an option", isPresented: $showDialog) {
ForEach(options, id: \.self) { option in
Button(option) {
selectedOption = option
}
}
Button("Cancel", role: .cancel) {}
}
注意:如果confirmationDialog设置的标题没有显示,在某些情况下(例如iOS标准样式下),系统可能认为标题不是必要的,进而隐藏标题。
如果确保标题始终显示,可以显式设置 titleVisibility 为 .visible。
.confirmationDialog("Choose an option", isPresented: $showDialog,
titleVisibility: .visible // 显示标题
) {
ForEach(options, id: \.self) { option in
Button(option) {
selectedOption = option
}
}
Button("Cancel", role: .cancel) {}
}
总结
适用场景:confirmationDialog 非常适合在需要用户选择多个操作的场景下使用,例如上下文菜单或设置选项。
灵活性:可以添加多个按钮,包括普通按钮、取消按钮和破坏性按钮,支持自定义标题和消息。
最佳实践:使用 role 明确按钮的意图(如 .cancel 或 .destructive),增强用户体验。