我有一个带有文档类(Main.as)的电影,它加载2个SWF:
private var mainContainer:Sprite = new Sprite();
addChild(mainContainer);
var loaderx:Loader = new Loader();
loaderx.contentLoaderInfo.addEventListener(Event.COMPLETE,loadingComplete);
loaderx.load(new URLRequest("PhotoLoader.swf")); // PhotoLoader.as
var viewer:Loader = new Loader();
viewer.contentLoaderInfo.addEventListener(Event.COMPLETE,loadingComplete);
viewer.load(new URLRequest("PhotoViewer.swf")); // PhotoViewer.as
private function loadingComplete(evt:Event):void {
evt.target.removeEventListener(Event.COMPLETE,loadingComplete);
mainContainer.addChild(evt.target.content);
}
现在我需要从PhotoViewer访问PhotoLoader中的一些var /对象,但是只要我编译PhotoViewer,编译器就会抱怨:
trace(root.loaderx.dbFields); 1119: Access of possibly undefined property loaderx through a reference with \ static type flash.display:DisplayObject.
注意我需要在2个加载的SWF之间进行通信,而不是从加载它们的电影中进行通信
答案 0 :(得分:0)
修改
我很惊讶类型转换为MovieClip失败但是我再次只有你在这里展示的代码。根据错误消息,您可以执行此操作:
var photoLoader:PhotoLoader = PhotoLoader(evt.target.content );
甚至
evt.target.content as PhotoLoader
甚至比作为MovieClip进行投射更好,因为您可以直接访问属性& PhotoLoader类的方法!
我不确定你的环境是什么,你是对的,我以为你想要从Main类访问这些类。显然是我的错!如果你在每个SWF上都有DocumentClasses,那么它就是你的代码结构的方式,你没有事件需要LocalConnection,你可以将Singleton类用作FrontController,这是对两个类的属性的集中访问。
编辑结束
首先,您可以将加载程序内容转换为MovieClip,如下所示:
var content:MovieClip = MovieClip(evt.target.content);
mainContainer.addChild(content);
evt.target.content应该来自DisplayObject类型,因此您无法访问影片剪辑属性。
如果您需要访问已加载的SWF的属性,您应该像这样声明它们:
private var photoViewer:MovieClip;
private var photoLoader:MovieClip;
然后你可以这样做:
photoViewer = MovieClip(evt.target.content);
mainContainer.addChild(photoViewer);
photoLoader = MovieClip(evt.target.content);
mainContainer.addChild(photoViewer);
只需为您的加载器命名即可区分MovieClips
loaderx.name = "photoLoader";
viewer.name = "photoViewer";
然后你可以这样做
private function loadingComplete(evt:Event):void
{
switch(event.currentTarget.loader.name)
{
case "photoLoader":
photoLoader = MovieClip(evt.target.content);
mainContainer.addChild(photoLoader);
break;
case "photoViewer":
photoViewer = MovieClip(evt.target.content);
mainContainer.addChild(photoViewer);
break;
}
if( photoViewer!= null && photoLoader!= null )
evt.target.removeEventListener(Event.COMPLETE,loadingComplete);
}
之后你应该能够像这样访问你的MovieClips属性
trace( photoLoader.dbFields );
或
var prop:Object = photoViewer.whateverNameYouGaveToYourProperty;