和UIComponent的states不同,ViewStack默认的创建策略creationPolicy=“auto”,并非跳转到某一页后,才创建INavigatorContent子项。


实际上,在ViewStack 被addChild到舞台显示列表,initialize方法被调用时,ViewStack就会创建所有的INavigatorContent子项,addChild到自身显示列表,调用各子项的initialize方法创建子项内容,不过除了当前显示的子项,并不会创建其他子项容器的子元素(INavigatorContent的实现器,mx Container和spark NavigatorContent,都是一个容器组件),会等到第一次跳转到指定容器时,创建该容器的所有子元素。


另外,作为ViewStack的INavigatorContent子项的具体组件,mx Container和spark NavigatorContent又有一些差别。

Container在被ViewStack addChild后,initialize方法执行完毕创建内容之后时,并不会调度initialize事件,因为Container覆盖了initializationComplication方法(该方法继承自UIComponent,会调度initialize事件),改成空方法。

而NavigatorContent没有覆盖这一方法。


所以,ViewStack在一开始就创建了所有INavigatorContent子项后,mx Container容器组件不会调度initialize事件,而是等到ViewStack第一次跳转到该子项页,容器创建所有子元素组件之后,才调度initialize事件,而NavigatorContent容器组件,在一开始被ViewStack addChild后,子元素组件还没有创建时,就调度了initialize事件,这时,该NavigatorContent容器所有子元素组件都尚未创建


结论:如果要让ViewStack中的某个子项——一个INavigatorContent容器组件,在其容器子元素全部创建完成后,或者ViewStack第一次转到该容器组件页后进行某种操作(如从远程服务器获取数据),则不能依赖INavigatorContent容器的initialize和creationComplete事件,因为spark NavigatorContent容器组件在调度initialize事件时,容器子元素尚未创建(经进一步测试,spark NavigatorContent调度creationComplete事件时,其子元素组件仍未创建),需要重写Container或是SkinnableContainer的createDeferredContent方法,在调用super.createDeferredContent后进行所需操作

另外还可以使用INavigatorContent的show事件,createDeferredContent只会执行一次,而show事件,会在每次切换到该容器时调度(也就是说,切换到某一容器,并不是addChild,removeChild某容器,而是设置容器的visible属性)