Shaula Blog

美丽的东西都是肤浅的

iOS UIAction

在上一篇文章我们介绍了如何使用 UIButtonConfiguration 对按钮的样式与状态进行管理,这篇文章介绍下可以同 UIButtonConfiguration 结合使用的一个类:UIAction.

什么是 UIAction

UIAction 是在 iOS 14 中引入的一个类,它封装了一个动作(action)以及该动作的相关属性(例如标题、图像、属性等)。你可以把它看作是一个将动作(闭包)和按钮的某些属性(如标题、图像)打包在一起的对象。它在 UIButton(configuration:primaryAction:) 初始化方法中作为参数,用于定义按钮的主要点击行为。

为什么使用 UIAction

在 iOS 14 之前,我们通常使用 addTarget(_:action:for:) 方法来为按钮添加事件处理。而使用 UIAction 则提供了一种更加现代和声明式的方式,特别是当与 UIButton.Configuration 结合使用时,可以更简洁地配置按钮和它的动作。

核心概念:

  1. 替代传统 Target-Action 模式
    取代旧的 addTarget(_:action:for:) 方法,使用闭包(closure)实现更简洁的代码。

  2. 封装操作和属性
    一个 UIAction 对象包含:

    • 操作处理闭包:按钮触发时执行的代码
    • 可选的属性:标题、图像、子菜单等(常用于 UIMenu 场景)

如何使用?

你可以创建一个 UIAction 实例,并将其作为 primaryAction 参数传递给按钮的初始化方法。当用户点击按钮时,UIAction 中的闭包(handler)就会被执行。

示例代码:

// 创建一个配置
var config = UIButton.Configuration.filled()
config.title = "点击我"
config.baseBackgroundColor = .systemBlue
// 创建一个 UIAction
let action = UIAction { _ in
    print("按钮被点击了!")
}
// 使用配置和 UIAction 创建按钮
let button = UIButton(configuration: config, primaryAction: action)

对比传统写法:

新方式 (iOS 14+)

let action = UIAction { _ in print("点击") }
let button = UIButton(primaryAction: action)

旧方式 (Target-Action)

let button = UIButton()
button.addTarget(self, action: #selector(handleTap), for: .touchUpInside)

@objc func handleTap() {
    print("点击")
}

注意:

  • primaryAction 参数是可选的,所以你可以传递 nil
  • 使用 UIAction 还可以方便地为按钮设置其他属性,比如在创建 UIAction 时指定标题、图像等,但通常我们会使用 UIButton.Configuration 来配置按钮的外观,而用 UIAction 主要处理动作。

添加多个动作

除了在初始化时设置主要动作(primary action),你还可以使用 UIButtonaddAction(_:for:) 方法为不同的事件添加多个动作(每个动作都是一个 UIAction 实例)。例如,你可以为 .touchUpInside.touchDown 分别添加动作。

总结:

UIAction 是一个封装了动作处理程序(闭包)以及相关属性的对象。在 UIButton 的初始化方法中,通过传递 UIAction 实例,你可以指定按钮被点击时执行的动作。这种方式比传统的 target-action 模式更简洁,尤其是在使用闭包时。