【SwiftUI】カレンダーを再描画する方法

カレンダーを実装するときに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した変数が他にもあると意図しないタイミングでリロードされてしまう(選択した日付の変数があると、日付を選択したタイミングで都度リロードされる)。

これを解決するために、リロード可能かどうかのフラグを用意して、イベントが追加されたときだけリロードするようにした。

参考:

https://developer.apple.com/forums/thread/653238

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog