早上在调试一段代码.正在按部就班的码代码。突然 一个对象报空对象引用了...
于是我郁闷了.这个bug让我很意外。
代码如下.
苦思许久,注意到出现bug的位置是viewStack里的第二个控件...
我就在想.会不会viewStack只默认实例化第一个控件?
于是我就调换了vPictureCanvas和vCameraCanvas的位置。然后调试。果然.vCameraShow.Height操作没有报空对象异常
为什么会这样?上网查了一下.viewstack使用了一种叫做 deferred instantiation的技术。需要的时候才实例化 这样可以提高性能.
而在Container对象中 有一个属性能改变这种实例化策略。此属性值叫做createPolicy
可以设置为4个值.
auto 默认.defered instantiation
all:在单一视图容器里实例化全部组件
none:指示Flex不实例化任何组件,除非你手动实例化组件。
当creationPolicy属性的值为none时,应该明确地指定容器的长和宽。正常情况吓,Flex会自动对容器进行比例缩放以使它能够容纳子实例,但因为creationPolicy属性的值设为none,开始时没有实例化容器内的子实例,要进行比例缩放是不可能的。如果你没有明确地调整容器的大小,直到容器内的子实例被实例化后才会自动调整大小以容纳子实例。
要手动实例化组件,请使用createComponentsFromDescriptors()方法。更多信息请看:Creating deferred components
queued:对延迟实例化组件没有影响。
所以 这里.把createPolicy设置为all能解决问题.
代码里加上creationPolicy="all".执行.果然成功
于是我郁闷了.这个bug让我很意外。
代码如下.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="initApp()">
<mx:Script>
<![CDATA[
private function initApp()
{
vCameraShow.height;
}
]]>
</mx:Script>
<mx:ViewStack id="vStack" borderStyle="solid" color="0x323232" >
<mx:Canvas id="vPictureCanvas" borderColor="0x000000" borderStyle="solid" borderThickness="0" >
<mx:Image id="vPicture" x="0" y="0" width="320" height="240"/>
</mx:Canvas>
<mx:Canvas id="vCameraCanvas" backgroundColor="#FFFFCC" label="Search" width="100%" height="100%">
<mx:VideoDisplay id="vCameraShow" width="320" height="240" />
</mx:Canvas>
</mx:ViewStack>
</mx:Application>
苦思许久,注意到出现bug的位置是viewStack里的第二个控件...
我就在想.会不会viewStack只默认实例化第一个控件?
于是我就调换了vPictureCanvas和vCameraCanvas的位置。然后调试。果然.vCameraShow.Height操作没有报空对象异常
为什么会这样?上网查了一下.viewstack使用了一种叫做 deferred instantiation的技术。需要的时候才实例化 这样可以提高性能.
而在Container对象中 有一个属性能改变这种实例化策略。此属性值叫做createPolicy
可以设置为4个值.
auto 默认.defered instantiation
all:在单一视图容器里实例化全部组件
none:指示Flex不实例化任何组件,除非你手动实例化组件。
当creationPolicy属性的值为none时,应该明确地指定容器的长和宽。正常情况吓,Flex会自动对容器进行比例缩放以使它能够容纳子实例,但因为creationPolicy属性的值设为none,开始时没有实例化容器内的子实例,要进行比例缩放是不可能的。如果你没有明确地调整容器的大小,直到容器内的子实例被实例化后才会自动调整大小以容纳子实例。
要手动实例化组件,请使用createComponentsFromDescriptors()方法。更多信息请看:Creating deferred components
queued:对延迟实例化组件没有影响。
所以 这里.把createPolicy设置为all能解决问题.
代码里加上creationPolicy="all".执行.果然成功