Swift上下文菜单式对话框confirmationDialog()
Swift上下文菜单式对话框confirmationDialog()

Swift上下文菜单式对话框confirmationDialog()

在 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),增强用户体验。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注