EventHierarchy
是一个小型的框架,旨在将 SwiftUI 视图层级结构用作事件处理的响应者链。
更详细的解释可以在 这篇文章 中找到。
概要:使用包含在 EnvironmentValues
中的闭包,层级结构中较低的 View
对象将 Event
对象发送到视图层级结构中,而层级结构中较高的视图使用修饰符之一注册自己作为响应者,以接收、转换或处理 Event
对象。
这是 ErrorHierarchy
的兄弟框架,但专门用于事件处理。
Event
是一个无需要求的协议,用于将类型标识为可以发送到 SwiftUI 视图层级结构中的事件。
它可以是任何类型,并包含任何类型的附加信息。它的存在是为了避免将此框架中方法使用的类型注释为 Any
。
事件使用添加到 EnvironmentValues
的 triggerEvent
闭包触发。
示例
struct MyEvent: Event {}
struct TriggerView: View {
@Environment(\.triggerEvent) var triggerEvent
var body: some View {
Button("Trigger") {
triggerEvent(MyEvent())
}
}
}
有三种可以应用于已触发的 Event
的操作。所有这些操作都是通过注册闭包来执行的,就像您将视图修饰符应用于 View
一样。
struct ContentView: View {
var body: some View {
TriggerView()
.receiveEvent { .notHandled }
.transformEvent { MyEvent() }
.handleEvent {}
}
}
所有这些函数都有一个泛型版本,它接收 Event
的类型作为第一个参数,只有与提供的类型匹配的事件才会被处理,任何其他事件都将继续在视图层级结构中传播。
struct ContentView: View {
var body: some View {
TriggerView()
.handleEvent(MyEvent.self) {}
}
}
接收 Event
时,由注册的闭包决定 Event
是否已完全处理。
如果注册的闭包返回 .handled
,则 Event
将不再在视图层级结构中传播。 如果它返回 .unhandled
,则 Event
将继续传播。
任何被处理的事件将不再在视图层级结构中传播。 这等效于使用始终返回 .handled
的 receiveEvent
闭包。
转换函数可用于替换接收到的 Event
。 它可以是不同类型的 Event
,也可以是相同类型但具有不同值的 Event
。