DatePicker と onChange
やりたいこと
- カレンダーのイベントの StartDate, EndDate 変更を DatePicker で変更
- StartDate が EndDate を追い抜いたときに EndDate をズラすといったコードを書きたい
うまく行かないやり方
onChange() で監視しようとすると
- 変数の初期化時にイベントが発生する
- Start, End でお互いイベント発生させ合う
という問題が起きる
swift
@State var startDate = Date()
...
VStack {
...
DatePicker("Start Date", selection: $startDate, displayedComponents: .date)
}
.onChange(of: $startDate) { oldValue, _ in
onStartDateChanged(oldValue)
}
うまくいくやり方
DatePicker に 渡す Binding にハンドラを定義。
こうすると、DatePicker での変更時のみ反応する。
swift
@State var startDate = Date()
DatePicker("Start Date", selection:
Binding(
get: {
startDate
},
set: { newValue in
let oldValue = startDate
startDate = newValue
onStartDateChanged(oldValue)
}
),
displayedComponents: .date
)