当我研究Kodeco的SwiftUI Apprentice一书时,我发现了下面的代码片段.
struct CountdownView: View {
let date: Date
@Binding var timeRemaining: Int
let size: Double
var body: some View {
Text("\(timeRemaining)") // 5
.font(.system(size: size, design: .rounded))
.padding()
.onChange(of: date) { _ in // 6
timeRemaining -= 1
}
}
}
struct TimerView: View {
@State private var timeRemaining: Int = 3 // 1
@Binding var timerDone: Bool // 2
let size: Double
var body: some View {
TimelineView( // 3
.animation(
minimumInterval: 1.0,
paused: timeRemaining <= 0)) { context in
CountdownView( // 4
date: context.date,
timeRemaining: $timeRemaining,
size: size)
}
.onChange(of: timeRemaining) { _ in
if timeRemaining < 1 {
timerDone = true // 7
}
}
}
}
struct TimerView_Previews: PreviewProvider {
static var previews: some View {
TimerView(timerDone: .constant(false), size: 90)
}
}
当我判断代码片段时,我首先希望重新创建CountdownView
.但在这种情况下,date
号房产不会发生变化.然后,我在CountdownView
的基础上添加了onAppear
个修改器来检测视图的重建.因此,它只创建一次.我提出了一个问题来帮助我理解SwiftUI的视图呈现机制,我仍然在研究这个机制,尽管date
属性是一个常量,并且不使用@Binding
,但如何可能观察到在SwiftUI中声明为常量的数据的变化?