Alter

在 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 的传统方式)。
主要类别AlertAction SheetAlertConfirmationDialogNSAlert
调用方式动态实例化,通过 present() 显示。绑定状态,响应式声明式。创建实例,并通过 runModal() 显示。
按钮样式.default.destructive.cancel.cancel.destructive必须通过 addButton 添加。
本文共 2534 字,上次修改于 Jan 11, 2025