Open2

TCAでUIViewRepresentableで実装したい場合の対応

Shun UematsuShun Uematsu

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だけ引数として渡せば良い。

Shun UematsuShun Uematsu

UICollectionViewでカスタムセルクラスに値を渡す場合、 updateUIView(_:context:)でCoordinator経由で都度値を更新しないと行けないかもしれない。