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つにする方法はないのでしょうかね。