Skip to main content

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
)