我遇到了一个与Flash和Flex有关的非常奇怪的问题。在特定情况下,如果在此期间加载了另一个SWF,则无法实例化使用Loader运行时加载的SWF中的影片剪辑。以下是可以重现错误的程序的完整代码。它是通过Ensemble Tofino编译的mxmlc:
package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.system.*;
public class DynamicLoading extends Sprite
{
private var testAppDomain:ApplicationDomain;
public function DynamicLoading()
{
var request:URLRequest = new URLRequest("http://localhost/content/test.swf");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTestLoadComplete);
loader.load(request);
}
private function onTestLoadComplete(e:Event):void
{
var loaderInfo:LoaderInfo = LoaderInfo(e.target);
testAppDomain = loaderInfo.applicationDomain;
// To get the error, uncomment these lines...
//var request:URLRequest = new URLRequest("http://localhost/content/tiny.swf");
//var loader:Loader = new Loader();
//loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTinyLoadComplete);
//loader.load(request);
// ...and comment this one:
onTinyLoadComplete();
}
private function onTinyLoadComplete(e:Event = null):void
{
var spriteClass:Class = Class(testAppDomain.getDefinition("TopSymbol"));
var sprite:Sprite = Sprite(new spriteClass());
sprite.x = sprite.y = 200;
addChild(sprite);
}
}
}
在上面注释掉第二个加载操作的情况下,代码可以正常运行。但是,如果取消注释第二个加载操作,并且在第二个SWF加载后运行onTinyLoadComplete,则包含“new spriteClass()”的行将失败,并出现以下异常:
TypeError: Error #1034: 类型转换失败: 无法将flash.display::MovieClip@2dc8ba1转换为SubSymbol。 at flash.display::Sprite/constructChildren() at flash.display::Sprite() at flash.display::MovieClip() at TopSymbol() at DynamicLoading/onTinyLoadComplete()[C:\Users\...\TestFlash\DynamicLoading.as:38]
test.swf和tiny.swf是在Flash CS4中创建的。test.swf包含两个符号,都导出为ActionScript,一个称为TopSymbol,另一个称为SubSymbol。SubSymbol包含一个简单的图形(涂鸦),而TopSymbol包含SubSymbol的单个实例。tiny.swf什么也没有;它是发布一个新的、空的ActionScript 3项目的结果。
如果我修改test.swf,使得SubSymbol不导出为ActionScript,错误就会消失,但在我们的真实项目中,我们需要能够动态加载包含其他导出精灵类作为子项的精灵类的能力。
有什么想法是什么原因造成这种情况,或如何解决?
编辑: 有几个人建议tiny.swf可能包含与test.swf或父级(DynamicLoading.swf)相同名称的类。它不是这样的。正如我上面所说,我自己创建了tiny.swf,只需发布一个全新的、空的Flash CS4项目即可。当在tiny.swf上运行swfdump -D时,以下是完整的输出: