カレンダーを実装するときにFS Calendarを使っているのだが、イベントを追加したときにドットがリアルタイムで表示されない。
他の月に行ってから戻ってくるとドットが出てくるので、イベントを追加したタイミングでリロードする処理が必要だと思って色々と試行錯誤してみて解決した。
UIViewRepresentableには、updateUIViewがある。シンプルにこの中でカレンダーをリロードすれば良い。
func updateUIView(_ uiView: FSCalendar, context: Context) { if(canReload==false){return} uiView.reloadData() }
この関数が呼ばれるのは、BindingやObservedObjectの変数が変わったときである。
下記のようにイベント情報を自分で作ったクラスの中に保存し、ObservedObjectにしておけばイベントが追加されたタイミングで、updateUIViewが呼ばれ、カレンダーがリロードされる。
@ObservedObject var t_Data:TrainingData
ただし、Bindingした変数が他にもあると意図しないタイミングでリロードされてしまう(選択した日付の変数があると、日付を選択したタイミングで都度リロードされる)。
これを解決するために、リロード可能かどうかのフラグを用意して、イベントが追加されたときだけリロードするようにした。
参考: