研究室の方々が、研究で作るデモアプリをAdobe AIRで実装するらしいので、
あえて初心者向けの内容も、脳内キャッシュからノートにシリアライズ。
まずは、ViewとLogicの分離について、IMXMLObjectインターフェースを使ったやり方。
【目的】
Viewを.mxmlファイルに、Logicを.asファイルに分けて記述したい。
mxmlから<mx:Script>タグや、<mx:Button click="hoge()">みたいなのを撲滅する!!
【方針】Buttonコンポーネントを持つViewをMVCSampleView.mxmlファイルに記述し、
MVCSampleLogic.asファイルに、そのButtonをクリックした際にAlertを表示するようにLogicを記述する。
【結果】
実装結果。[右クリック -> ソースを表示]でソースが見れます。
【解説】
・MVCSampleViewクラス <mx:Application>タグに、creationComplete="creationCompleteHandler()"なんて書かない!!
代わりに、
を入れてやる。
Buttonには、"button"というidを振っておく。
・Logicクラス
IMXMLObjectインターフェースは、UIComponentを継承しないけど、mxmlにタグとしてオブジェクトを貼付けたいときに実装すべきインターフェースで、
このIMXMLObjectインターフェースをimplementsし、initializedメソッドを実装する。
引数は document:Object, id:String で、
initializedメソッドはFlexフレームワークにより自動的に呼ばれる。タイミングはmxmlのinitializeの時(たぶん)。
この場合では、documentにはこのオブジェクトを生成したmxmlであるMVCSampleViewへの参照が、idには、文字列"logic"が与えられる。
そして、ViewのCreationCompleteのタイミングでメソッドが呼ばれるようにしておき、
サブクラスがオーバーライドできるようにしておく。
・MVCSampleLogicクラス プライベート変数として_viewを宣言。(プライベート変数は、先頭に'_'をつける習慣がある)
高速化とコード補完の意味を兼ねて、MVCSampleViewで型宣言もしておく。
Logicで定義した、view_initializeHandlerをオーバーライドし、
この中で、_viewにMVCSampleViewへの参照を入れておく。この内容の処理は、initializedをオーバーライドして、その中に書いてもほぼ同じこと。
initializeフェーズでは、子コンポーネントの生成や、Viewの見た目に影響のある初期化処理を行う。
次に、view_creationCompleteHandlerをオーバーライドする。
このタイミングでは、描画準備の処理が行われているので、今更Viewに大きな影響を与えるような処理は書かない。
イベントリスナーを追加するくらい。
なので、buttonオブジェクトにクリックイベントのイベントリスナーを追加する。
【まとめ】
・mxmlには、ActionScriptを(極力)書かない。
サンプルでよく書かれているのは、複数ファイルにわけるとサンプルが見にくくなるし、実際に提示したい提示したいコード以外のところであまり記述を増やしたくないため・mxmlにスクリプトを書かない代わりに、IMXMLObjectを実装したクラスを貼っておく。
・main関数みたいな感じで、IMXMLObjectクラスのinitializedメソッドが自動で呼ばれる。
・InitializeとCreationCompleteの適切なタイミングで、適切な処理を記述する。
<参考>
SQLiteのDB操作を追加してAIRウィジェットを完成(1/4)- @IT