Flex4 关于TabNavigator 内部控件的初始化延迟问题!

来源:互联网 发布:c语言结构体使用 编辑:程序博客网 时间:2024/05/20 17:09
 使用代码对TabNavigator的非默认视图(我的子视图内是VBox内包含textArea) 进行操作的时候,报错空对象!

解决办法:在TabNavigator属性中添加creationPolicy=“all”,意思是TabNavigator创建的时候所有子视图全部实例化,否则只实例化默认视图,虽然这样做会导致程序启动稍微慢一些。

-----------------------------------------------------下面这个文章解决了我的问题

导航条容器内置推迟实例化
Flex 中的导航条容器(ViewStack、Accordin、TabNavigator)中内置了推迟实例化。默认情况下,推迟实例化意味着Flex 在启动时不会创建任何子视图,但用户通过导航到该容器可触发所有子视图的创建。下面的代码显示了两个导航条容器 TabNavigator 和 ViewStack 的使用:

<mx:tabnavigator>
<mx:vboxid="tabNavView1">
<mx:linkbardataprovider="myViewStack">
<mx:viewstackid="myViewStack">
<mx:vboxid="view1">
</mx:vbox>
<mx:vboxid="view2">
</mx:vbox>
<mx:vboxid="view3">
</mx:vbox>
</mx:viewstack>
</mx:linkbar>
<mx:vboxid="tabNavView2">
</mx:vbox>
</mx:vbox>
</mx:tabnavigator>

TabNavigator 容器创建了 tabNavView1,因为它是 Flex 实例化 TabNavigator 容器时显示的第一个视图。实例化 tabNavView1 导致 LinkBar 和 ViewStack 的第一个视图 view1 被实例化。当用户与 LinkBar 交互以选择 ViewStack 中的另一个视图时,Flex 将创建该视图。Flex 如此继续,在调用时创建导航条的所有后代对象。

容器标签中的 creationPolicy 属性控制子视图的创建。下面的列表将解释 Flex 导航条容器每个 creationPolicy 属性设置的含义。

  • creationPolicy=“auto”
    Flex 创建导航条容器时将不会立即创建所有的后代对象,只创建开始时可见的后代对象。这一推迟实例化行为的结果是带有导航条容器的 MXML 应用程序加载很快,但从一个视图浏览至另一视图时,用户将等待短暂的停顿时间。可用性研究表明,与应用程序启动时为创建所有导航条子视图而等待较长时间相比,这种用户体验更好。同样,用户可能从不访问某些子视图,因而在启动时创建这些子视图会浪费资源。注意,如果在一个非导航条容器上设置 creationPolicy 为“auto”,则必须加入额外的代码来指示何时创建该容器的子对象。这些额外代码已经内置进导航条容器中,因而可在导航条容器上设置 creationPolicy 为“auto”而无需任何额外的工作。
  • creationPolicy=“all”
    Flex 创建导航条容器时将创建所有子视图中的所有控件。这一设置导致程序启动时有一个延迟,但在视图之间切换的响应时间将会较短。
  • creationPolicy=“none”
    Flex 将不会实例化导航条容器中或者其子视图中的任何组件,直到实例化方法被显式调用。可用 createComponents() 方法显式地实例化视图。Flex 文档中有更多关于设置自定义组件创建计划的信息。

通过设置 creationPolicy 属性,可手工创建子视图,并决定在应用程序架构的何处发生创建导航条容器子视图所需的资源占用。可用性研究显示,使用 auto 设置可取得较好的用户体验。一个常见的错误会延长应用程序启动时间,即错误地在某一个导航条容器上设定 creationPolicy=“all”。仅当能确保组件创建计划足够高效时可设置 creationPolicy 为“all”。

转载自zrong's Blog