iOS UIAction
在上一篇文章我们介绍了如何使用 UIButtonConfiguration 对按钮的样式与状态进行管理,这篇文章介绍下可以同 UIButtonConfiguration 结合使用的一个类:UIAction.
什么是 UIAction?
UIAction 是在 iOS 14 中引入的一个类,它封装了一个动作(action)以及该动作的相关属性(例如标题、图像、属性等)。你可以把它看作是一个将动作(闭包)和按钮的某些属性(如标题、图像)打包在一起的对象。它在 UIButton(configuration:primaryAction:) 初始化方法中作为参数,用于定义按钮的主要点击行为。
为什么使用 UIAction?
在 iOS 14 之前,我们通常使用 addTarget(_:action:for:) 方法来为按钮添加事件处理。而使用 UIAction 则提供了一种更加现代和声明式的方式,特别是当与 UIButton.Configuration 结合使用时,可以更简洁地配置按钮和它的动作。
核心概念:
-
替代传统 Target-Action 模式
取代旧的addTarget(_:action:for:)方法,使用闭包(closure)实现更简洁的代码。 -
封装操作和属性
一个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),你还可以使用 UIButton 的 addAction(_:for:) 方法为不同的事件添加多个动作(每个动作都是一个 UIAction 实例)。例如,你可以为 .touchUpInside 和 .touchDown 分别添加动作。
总结:
UIAction 是一个封装了动作处理程序(闭包)以及相关属性的对象。在 UIButton 的初始化方法中,通过传递 UIAction 实例,你可以指定按钮被点击时执行的动作。这种方式比传统的 target-action 模式更简洁,尤其是在使用闭包时。