🎣 LifecycleHooks🎣
关于
LifecycleHooks 允许在响应生命周期事件时将自定义代码注入到视图和视图控制器中,例如
viewController.on(.viewDidAppear) { animated in
print("View did appear", animated)
}
以下生命周期事件受到支持
-
UIViewController
生命周期钩子viewDidLoad
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear
-
UIView
生命周期钩子didMoveToWindow
注意:动作将在对象的相应方法实现之后运行,例外的是 viewDidLoad
,该钩子会在视图控制器自己的 viewDidLoad
实现之前运行。
如何工作?
生命周期事件会自动传递给视图控制器下的子控制器(以及视图的子视图)。通过在层次结构中添加一个不可见的视图/视图控制器,可以在合适的点上执行自定义代码。这受到了 Soroush Khanlou 的文章 这篇 的启发。
这种方法经过优化,以避免在添加钩子时过早地强制加载目标视图控制器的视图。这是通过使用 KVO 监视视图加载情况来实现的。这就是 viewDidLoad
钩子实现的方式,也是为什么这个特定的钩子会在 viewDidLoad
被调用之前运行的原因。
用例
在大多数情况下,使用子类化可以直接在视图/视图控制器中添加与生命周期相关的代码而无需外部代码注入。然而,在某些情况下,这是不可能的,例如:
- 当编写一个
UIViewController
扩展。 - 当您需要从第三方库中自定义视图控制器时,您不负责亲自实例化视图控制器。
- 当需要将基于生命周期的行为添加到在运行时才知道类型的视图控制器时。
- 当需要添加多个操作,但单重继承使得这种方式不切实际时。
- 当编写视图控制器的测试时,例如,测试期望应在特定生命周期事件之后得到满足。
功能
以下参数允许进一步自定义生命周期钩子
onceOnly
:钩子是否只执行一次或每次生命周期事件触发时。priority
:如果您为特定生命周期事件添加了多个钩子,它们将按照优先级顺序执行,(如果优先级相同,则按添加的顺序执行)。- 可以在任何时候通过在返回的对象上调用
cancel()
来取消钩子。
安装
CocoaPods
LifecycleHooks 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile
pod 'LifecycleHooks'
Carthage
将以下内容添加到您的 Cartfile
github "johnpatrickmorgan/LifecycleHooks"
Swift 包管理器
将以下内容添加到您的 Package.swift
中的 dependencies
数组中
dependencies: [
.package(url: "https://github.com/johnpatrickmorgan/LifecycleHooks.git", from: "0.6.1")
]
授权协议
LifecycleHooks 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。