SwiftUI 的 .onReceive 修饰符用于捕获由某个 Publisher 发布的事件,并以此触发一些操作。其中,定时器 Timer 也是一个 Publisher,它会定时发布事件,因此可以被 .onReceive 捕获。
以下是一个例子,每隔一秒钟打印一次当前时间:
struct ContentView: View {
@State private var currentTime = Date()
var body: some View {
Text(currentTime.description)
.onReceive(Timer.publish(every: 1.0, on: .main, in: .common).autoconnect()) { _ in
currentTime = Date()
}
}
}
在这个例子中,我们使用 Timer.publish 创建了一个每秒钟发布事件的定时器,然后使用 .autoconnect() 方法让它自动连接到当前 RunLoop,这样它才能顺利地工作。最后,我们使用 .onReceive 捕获了每次定时器事件的发生,并在处理函数中更新了显示时间的状态变量 currentTime。