弃用通知

EventHierarchy 和 ErrorHierarchy 已经合并到 HierarchyResponder 中。HierarchyResponder 不仅包含对事件和错误的支持,还允许两者之间的互操作性,使您可以捕获错误并将其转换为事件,并为事件响应器添加抛出支持。

事件层级

tests codecov Platforms Swift 5.5 License Twitter

EventHierarchy 是一个小型的框架,旨在将 SwiftUI 视图层级结构用作事件处理的响应者链。

更详细的解释可以在 这篇文章 中找到。

概要:使用包含在 EnvironmentValues 中的闭包,层级结构中较低的 View 对象将 Event 对象发送到视图层级结构中,而层级结构中较高的视图使用修饰符之一注册自己作为响应者,以接收、转换或处理 Event 对象。

这是 ErrorHierarchy 的兄弟框架,但专门用于事件处理。

事件

Event 是一个无需要求的协议,用于将类型标识为可以发送到 SwiftUI 视图层级结构中的事件。

它可以是任何类型,并包含任何类型的附加信息。它的存在是为了避免将此框架中方法使用的类型注释为 Any

触发 Event

事件使用添加到 EnvironmentValuestriggerEvent 闭包触发。

示例

struct MyEvent: Event {}

struct TriggerView: View {
	@Environment(\.triggerEvent) var triggerEvent
	
	var body: some View {
		Button("Trigger") {
			triggerEvent(MyEvent())
		}
	}
}

接收、处理和转换 Event

有三种可以应用于已触发的 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 时,由注册的闭包决定 Event 是否已完全处理。

如果注册的闭包返回 .handled,则 Event 将不再在视图层级结构中传播。 如果它返回 .unhandled,则 Event 将继续传播。

处理 Event

任何被处理的事件将不再在视图层级结构中传播。 这等效于使用始终返回 .handledreceiveEvent 闭包。

转换 Event

转换函数可用于替换接收到的 Event。 它可以是不同类型的 Event,也可以是相同类型但具有不同值的 Event