在 Swift 开发中,Alert 通常与用户界面(UI)交互相关,主要用于显示 提示框、警告框或通知框 等弹出信息给用户。这种机制在 iOS 和 macOS 应用开发中被广泛使用。根据开发平台的不同以及具体使用场景,Alert 的实现方式和功能有所不同。
以下将分 iOS 和 macOS 平台详细介绍 Alert 的使用方法及其细节。
1. iOS——UIAlertController (UIKit)#
在 iOS 中,UIAlertController 是创建和显示 提示框(Alert)、动作表(Action Sheet) 的主要类。它支持:
- 警告框(Alert): 用于显示信息,要求用户作出选择。
- 动作表(Action Sheet): 通常从屏幕底部弹出,用于表现与用户当前操作相关的上下文选项。
基础用法#
1.1 显示一个简单的警告框#
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 创建 Alert
let alert = UIAlertController(
title: "警告",
message: "这是一个简单的提示框",
preferredStyle: .alert
)
// 添加按钮(操作)
alert.addAction(UIAlertAction(title: "确认", style: .default, handler: nil))
// 显示 Alert
self.present(alert, animated: true, completion: nil)
}
}- 代码解析:
title:警告框的标题,例如"警告"。message:显示的主要信息,例如"这是一个简单的提示框"。preferredStyle:提示框类型,支持.alert(窗口中央)或.actionSheet(从底部弹出)。
1.2 添加多个按钮选项#
你可以为用户提供多个操作,通过回调处理用户的选择。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let alert = UIAlertController(
title: "选择操作",
message: "你可以选择以下操作",
preferredStyle: .alert
)
// 添加按钮 - 确认
alert.addAction(UIAlertAction(title: "确认", style: .default, handler: { _ in
print("用户选择了 确认")
}))
// 添加按钮 - 取消
alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { _ in
print("用户选择了 取消")
}))
// 添加按钮 - 错误操作
alert.addAction(UIAlertAction(title: "删除", style: .destructive, handler: { _ in
print("用户选择了 删除")
}))
self.present(alert, animated: true, completion: nil)
}
}- 多个按钮样式:
.default:普通样式按钮(默认样式)。.cancel:取消操作样式的按钮,通常用来表示退出操作。.destructive:破坏性操作的按钮(通常是删除或危险操作),文字显示为红色。
1.3 使用动作表(Action Sheet)#
动作表通常用于在屏幕底部显示一组对用户当前操作的相关选项。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let actionSheet = UIAlertController(
title: "选择操作",
message: "你可以选择以下任务",
preferredStyle: .actionSheet
)
// 添加按钮 - 确认
actionSheet.addAction(UIAlertAction(title: "确认", style: .default, handler: { _ in
print("用户选择了 确认")
}))
// 添加按钮 - 取消
actionSheet.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { _ in
print("用户选择了 取消")
}))
self.present(actionSheet, animated: true, completion: nil)
}
}- 区别:
Alert:弹窗显示在屏幕中间,用户必须点击按钮关闭。Action Sheet:弹窗从屏幕底部滑出,常见于上下文菜单操作。
适用于 iPhone、iPad 的不同优先级#
在 iPad 上,Action Sheet 显示方式有所不同,通常需要指定其显示的锚点(sourceView / sourceRect):
actionSheet.popoverPresentationController?.sourceView = self.view
actionSheet.popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: 1, height: 1)2. iOS / macOS——Alert in SwiftUI#
在 SwiftUI 中,Alert 是更现代化的方式,同样可以在 iOS 和 macOS 上显示警告框,提供简单的信息或让用户作出选择。不再直接依赖 UIAlertController。
基础用法#
2.1 简单的 Alert#
import SwiftUI
struct ContentView: View {
@State private var showAlert = false
var body: some View {
VStack {
Button("显示提示框") {
showAlert = true
}
.alert("提示", isPresented: $showAlert) {
// 这里是按钮
Button("确认", role: .cancel) { print("点击了确认") }
} message: {
Text("这是一个简单的提示框") // 消息内容
}
}
}
}- 代码解析:
isPresented: 绑定一个状态变量(@State),当状态为true时显示。Button: 构建警告框的按钮操作。message: 提示框的主要信息。role: 按钮的角色,允许值:.cancel: 取消操作。.destructive: 破坏性操作(红色按钮)。
2.2 添加多个按钮#
import SwiftUI
struct ContentView: View {
@State private var showAlert = false
var body: some View {
VStack {
Button("显示提示框") {
showAlert = true
}
.alert("选择操作", isPresented: $showAlert) {
Button("确认", role: .none) { print("用户点击了确认") }
Button("取消", role: .cancel) { print("用户点击了取消") }
} message: {
Text("请选择你要进行的操作")
}
}
}
}2.3 使用 ActionSheet#
在 SwiftUI 中,某些场景下可以用 ActionSheet 来替代警告。
import SwiftUI
struct ContentView: View {
@State private var showSheet = false
var body: some View {
VStack {
Button("显示动作表") {
showSheet = true
}
.confirmationDialog("选择操作", isPresented: $showSheet) {
Button("确认", role: .none) { print("确认操作") }
Button("删除", role: .destructive) { print("删除操作") }
Button("取消", role: .cancel) { print("取消操作") }
}
}
}
}3. macOS——NSAlert (AppKit)#
在 macOS 应用开发中,提示框通过 NSAlert 实现,与 iOS 的 UIAlertController 功能相似。
基础用法#
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let alert = NSAlert()
alert.messageText = "提示框标题"
alert.informativeText = "这是一个提示框消息"
alert.alertStyle = .warning
alert.addButton(withTitle: "确认")
alert.addButton(withTitle: "取消")
let response = alert.runModal()
if response == .alertFirstButtonReturn {
print("用户点击了确认")
} else if response == .alertSecondButtonReturn {
print("用户点击了取消")
}
}
}alertStyle:.warning: 警告风格提示框。.informational: 信息风格提示框。.critical: 严重错误提示框。
4. 小结#
通过上面的讲解可以看到,Alert 的使用方式因平台和框架而异:
| 功能 | UIKit (UIAlertController) | SwiftUI (Alert) | AppKit (NSAlert) |
|---|---|---|---|
| 适用范围 | iOS(经典方式),可显示警告框或动作表。 | iOS 和 macOS(现代化声明式 UI)。 | macOS(基于 AppKit 的传统方式)。 |
| 主要类别 | Alert 和 Action Sheet。 | Alert 和 ConfirmationDialog。 | NSAlert。 |
| 调用方式 | 动态实例化,通过 present() 显示。 | 绑定状态,响应式声明式。 | 创建实例,并通过 runModal() 显示。 |
| 按钮样式 | .default、.destructive、.cancel。 | .cancel、.destructive。 | 必须通过 addButton 添加。 |