2012/07/05

Flex4.6にて
ViewNavigatorApplicationにおいてdestructionPolicy="never"でView遷移するときの動作についてです。
普通は、↓のようにして、pushView/popViewで遷移して、HomeViewのみインスタンスは1つだけ
という動作になります。(NextViewは毎回インスタンスが生成されます。)

これで、HomeViewにNEXTボタン、NextViewにBACKボタンを定義して
それぞれpushView/popViewで遷移するようにして、
add/creationComplete/viewActivate/viewDeactivateのイベントを定義すると
次のような順番に処理が行われます。


HomeView addHandler
HomeView creationCompleteHandler
HomeView viewActivateHandler
--push NEXT button--
NextView addHandler
NextView creationCompleteHandler
HomeView viewDeactivateHandler
NextView viewActivateHandler
--push BACK button--
HomeView addHandler
NextView viewDeactivateHandler
HomeView viewActivateHandler     createしていない
--push NEXT button--
NextView addHandler
NextView creationCompleteHandler
HomeView viewDeactivateHandler
NextView viewActivateHandler

NextViewからHomeViewに戻るときにcreateしていないことがわかります。


ここで問題。


私が作りたいアプリは、HomeViewではなくNextViewのインスタンスを1つにして、
NextViewのcreateを1回だけにしたかったのです。
いろいろ悩んた結果、次のようにしました。


NEXTボタン
 1回目HomeViewからNextViewに遷移するときは、replaceViewにして、
 2回目からは、popViewで遷移します。
BACKボタン
 NextViewからHomeViewはpushViewで遷移します。


そうすると、次のような順番で処理が行われ、
HomeViewではなく、NextViewのインスタンスを1つに保つことができました。



HomeView addHandler
HomeView creationCompleteHandler
HomeView viewActivateHandler
--push NEXT button--
HomeView [navigator.replaceView(NextView)]
NextView addHandler
NextView creationCompleteHandler
HomeView viewDeactivateHandler
NextView viewActivateHandler
--push BACK button--
NextView [navigator.pushView(HomeView, "pop")]
HomeView addHandler
HomeView creationCompleteHandler
NextView viewDeactivateHandler
HomeView viewActivateHandler
--push NEXT button--
data=pop
HomeView [navigator.popView()]
NextView addHandler
HomeView viewDeactivateHandler
NextView viewActivateHandler     createしていない


dataを用いて、1回目と2回目を区別するようにする場合、こんな感じです。

// HomeViewのNextボタン押下時
protected function btnNext_clickHandler(event:MouseEvent):void
{
 if(data == null){
  trace("HomeView [navigator.replaceView(NextView)]");
  navigator.replaceView(NextView);
 } else {
  trace("data=" + data);
  trace("HomeView [navigator.popView(slideLeftTran)]");
  navigator.popView(slideLeftTran);
 }
}
でもちょっとむりくり感があります。
もっと簡単にインスタンスを1つにする方法はないのでしょうかね。