Open2
TCAでUIViewRepresentableで実装したい場合の対応
TCA & SwiftUIで実装しているときに、画面の一部をUIKitで実装したい場合
UIViewRepresentable
に適合した構造体でもStateの変更に応じたViewの変更やActionを発行したいケースがありました。そのときにViewStore<State, Action>
を引数としてUIViewRepresentable
側に渡し、ViewStore
経由で状態の変更やアクションを発行しようとしていました。
問題点
ViewStoreのスコープに入っているいずれかのStateが変更されるたびに、UIViewRepresentable
のメソッドの一つである、makeUIView(context:)
が都度呼ばれてしまいます。
解決方法
ViewStore<State, Action>
を引数として渡すのではなくBinding<State, Action>
を引数として渡す。
UIViewRepresentable
に適合した構造体側では、@Binding
をつけたプロパティとして定義しSwiftUIと同じ要領で参照や更新を行えば、Bindingで渡されたStateが変更されたときだけupdateUIView(_:context:)
が呼ばれるようになる。
またアクションは発行せず、状態の変更だけ監視したい場合は、Stateだけ引数として渡せば良い。
UICollectionViewでカスタムセルクラスに値を渡す場合、 updateUIView(_:context:)
でCoordinator経由で都度値を更新しないと行けないかもしれない。