widget部品化のすゝめ

色々書こうと思ったけど百聞は一見にしかず、ということで。

f:id:aki_senri:20191211204437p:plain

UserWidgetを利用することで複数のWidgetを組み合わせたWidgetを作成することができ、同じデザインのwidgetを使い回すことができる。
何かあった時の修正も一つのwidgetの変更で済むようになる。
特にそれぞれのサイズを一定にしたい場合等に全部のUIサイズをいじるのは非効率極まりない。
ただサイズだけの問題なら、まあ解決は難しくない。
そこにボタンを配置して、それぞれの位置を調整して、ボタン全てにイベントを設定してなんて日には、ストレスで胃に穴が開く前に指示した奴の胃に穴を開けかねない。

やり方

やることは簡単で、ただUser Widgetを利用するだけ。
User Widgetを複数個配置するだけで、同じデザインのUIを配置することができる。
最初の画像のUIだとこんな感じ。
f:id:aki_senri:20191211204457p:plain

問題

User Widgetを配置するとボタンのクリック等、個別のイベントの処理を作成できなくなる。
そうなると、デザインは同じだけどボタンをクリックした時の動作は別のものにしたくても変更ができない。
そこで、デリゲートを利用する。
デリゲートはUser Widgetを配置後に個別に関数をバインドできるため、User Widget側でイベントとデリゲートの呼び出しを繋ぐことで、後からデリゲートにバインドされた処理をイベントから呼び出されるように設定ができる。

まずはイベントグラフからイベントディスパッチャーを作成する。
f:id:aki_senri:20191211205457p:plain

次にUserWidgetを利用するWidgetから動作を変更したいイベントからイベントディスパッチャーを呼び出す。
以下はOn Clickedからイベントディスパッチャーの呼び出しを行うように設定。
f:id:aki_senri:20191211211213p:plain

ここまで出来たらあとはUserWidgetを呼び出す側で設定を行うだけ。
UserWidgetを使用している側のデザイナの詳細タブにイベントディスパッチャーのイベントが追加される。
f:id:aki_senri:20191211211518p:plain

これをクリックするとイベントディスパッチャーが呼び出された際のBPの設定が行えるので、あとは好きに動作を設定すればOK。
f:id:aki_senri:20191211211824p:plain

On Clicked → イベントディスパッチャーの呼び出し → イベントディスパッチャーに設定した動作の実行
の順に動作するので、UserWidgetを利用する側から好きに動作を変更できるようになる。