SwiftUI Alert提示框
SwiftUI Alert提示框

SwiftUI Alert提示框

在 SwiftUI 中,Alert 是用来展示提示框的主要方式。它能够显示一条信息和一组按钮以供用户选择。

基本使用

以下是最简单的 Alert 示例,用于显示标题、信息和一个按钮。

@State private var showAlert = false

var body: some View {
    VStack {
        Button("显示提示框") {
            showAlert = true
        }
        .alert("提示框标题", isPresented: $showAlert) {
            Button("确定", role: .cancel) {}
        } message: {
            Text("这是提示框的内容信息。")
        }
    }
}

带多个按钮的 Alert

如果需要提供多个操作选项,可以在 buttons 中添加多个按钮。

@State private var showAlert = false

var body: some View {
    VStack {
        Button("显示提示框") {
            showAlert = true
        }
        .alert("警告", isPresented: $showAlert) {
            Button("确定") {
                print("点击了确定")
            }
            Button("删除", role: .destructive) {
                print("点击了删除")
            }
            Button("取消", role: .cancel) {
                print("点击了取消")
            }
        } message: {
            Text("你确定要继续吗?")
        }
    }
}

动态内容的 Alert

通过绑定变量,可以动态更新提示框的内容:

@State private var showAlert = false
@State private var alertTitle = "默认标题"
@State private var alertMessage = "默认消息"

var body: some View {
    VStack {
        Button("显示提示框") {
            alertTitle = "动态标题"
            alertMessage = "这是动态生成的提示内容!"
            showAlert = true
        }
        .alert(alertTitle, isPresented: $showAlert) {
            Button("确定") {}
        } message: {
            Text(alertMessage)
        }
    }
}

带输入框的提示框

SwiftUI 的原生 Alert 不支持直接嵌入输入框。如果需要在提示框中添加输入框,可以结合 TextField 和 Sheet 或自定义视图来实现:

@State private var showSheet = false
@State private var userInput = ""

var body: some View {
    VStack {
        Button("显示输入框提示") {
            showSheet = true
        }
    }
    .sheet(isPresented: $showSheet) {
        VStack {
            Text("请输入内容")
            TextField("在此输入", text: $userInput)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()
            Button("确定") {
                print("用户输入:\(userInput)")
                showSheet = false
            }
            .padding()
        }
        .padding()
    }
}

实际上调用Sheet页填写内容。

绑定一个Bool和Identifiable对象

alert 的显示可以绑定到一个布尔值,并通过 presenting: 传递一个可选的 Identifiable 对象。

示例代码

import SwiftUI

struct User: Identifiable {
    var id = "Fang jun yu"
}

struct ContentView: View {
    @State private var selectedUser: User? = nil
    @State private var isShowingUser = false
    var body: some View {
        Button("Tap Me") {
            selectedUser = User() // 设置有效的 User 实例
            isShowingUser = true  // 触发 alert 显示
        }
        .alert("Welcome", isPresented: $isShowingUser, presenting: selectedUser) { user in
            Button(user.id) { }
        }
        
    }
}

运行结果

点击按钮后会弹出一个警告框,按钮文本为 “Fang jun yu”。

注意:如果selectedUser 的值始终是 nil,user.id 将无法被显示。因此在Button中设置User实例后,user.id才得到显示。

message修饰符

在 SwiftUI 的 .alert 修饰符中,message 参数是特定于这个修饰符的,表示一个额外的文本内容,用于补充说明提示框的主题。

.alert("标题", isPresented: $showAlert, actions: {
    Button("确认", role: .destructive) { }
    Button("取消", role: .cancel) { }
}, message: {
    Text("补充说明内容")
})

message 的用途

1、可选参数: 如果没有需要补充的说明,可以省略。

2、显示样式: message 的文本会比 title 的文本小,通常显示在 title 的下方。

总结

Alert 适合用于简单的提示或确认操作。

对于复杂的内容(如输入框),建议结合 Sheet 或 Modal 自定义界面。

按钮的 role 属性可以标记为 .cancel 或 .destructive,以更好地适配 iOS 设计规范。

更多知识

Button 的 role 属性

在 SwiftUI 中,Button 的 role 属性用于为按钮提供语义角色,以便操作系统能够识别按钮的用途,并在需要时进行视觉或功能上的适配(例如危险操作按钮的红色样式)。目前,ButtonRole 枚举提供了以下三种角色:

1、.cancel

用途: 表示取消操作的按钮,通常在用户希望放弃当前操作时使用。

效果: 操作系统可能会赋予该按钮更柔和的视觉效果,以表明它是一个安全操作。

示例

Button("取消", role: .cancel) {
    print("取消操作")
}

2、destructive

用途: 表示危险操作的按钮,例如删除或清除重要数据。

效果: 按钮通常会显示为红色(在 iOS 上),以提醒用户该操作可能带来不可逆的后果。

示例

Button("删除", role: .destructive) {
    print("执行删除操作")
}

3、nil

用途: 如果不指定 role,默认为 nil,表示普通按钮。

效果: 按钮会保持常规样式。

示例

Button("普通按钮") {
    print("普通按钮操作")
}
系统支持的优化

1、动态更新样式:

使用 .cancel 或 .destructive,系统会自动根据上下文或平台设计语言(如 iOS、macOS)调整按钮的样式。

2、无障碍支持:

系统会通过 role 提供额外的语义信息,方便屏幕阅读器(如旁白)提示用户按钮的作用。

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

发表回复

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