如何在文档 class 中使用访问阶段加载外部 swf?
How to load external swf with access stage in document class?
我有一个加载其他 swf 的主 swf。使用主 swf (sketch) 中的以下代码一切正常:
var loader:Loader = new Loader();
stage.addChild(loader);
loader.load(new URLRequest('external.swf'));
但是,当尝试加载使用 文档 class 的外部 swf 时,它出现了对 stage
对象的访问错误。为了更清楚,将要加载的swf发布中配置了一个文档class:
在 Main.as
内,有 class 作为舞台的访问代码:
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main() {
// access stage
trace(stage);
trace(stage.stageWidth);
}
}
}
当主swf尝试加载外部swf时,出现错误:
null
TypeError: Error #1009: Cannot access a property or method of a null object reference.
如何解决这个问题?
不要在加载的 swf 的构造函数中引用 stage
。改为订阅 Event.ADDED_TO_STAGE
。
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main() {
trace("1 stage="+stage); // null, if this swf is loaded
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
protected function onAddedToStage(event:Event):void
{
trace("2 stage="+stage); // object
}
}
}
更新: 如果您无法修改加载的 swf,您可以在加载程序 swf 中覆盖其主要 class 定义。如果加载的 swf 的 Main class 包含重要的 and/or 不断变化的逻辑,这可能会产生不良后果。
- 在你的 loader swf 中定义
Main
class
- 在 Main 构造函数中使用
ADDED_TO_STAGE
编写适当的操作以正确访问阶段。
- 将此
Main
编译到您的加载器 swf 中:只需在主 swf 代码的某处添加 Main;
(这也可以通过 flash builder 中的编译器参数来完成,但何必呢)。
这样您就可以完全替换 Main
的定义。
我有一个加载其他 swf 的主 swf。使用主 swf (sketch) 中的以下代码一切正常:
var loader:Loader = new Loader();
stage.addChild(loader);
loader.load(new URLRequest('external.swf'));
但是,当尝试加载使用 文档 class 的外部 swf 时,它出现了对 stage
对象的访问错误。为了更清楚,将要加载的swf发布中配置了一个文档class:
在 Main.as
内,有 class 作为舞台的访问代码:
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main() {
// access stage
trace(stage);
trace(stage.stageWidth);
}
}
}
当主swf尝试加载外部swf时,出现错误:
null
TypeError: Error #1009: Cannot access a property or method of a null object reference.
如何解决这个问题?
不要在加载的 swf 的构造函数中引用 stage
。改为订阅 Event.ADDED_TO_STAGE
。
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main() {
trace("1 stage="+stage); // null, if this swf is loaded
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
protected function onAddedToStage(event:Event):void
{
trace("2 stage="+stage); // object
}
}
}
更新: 如果您无法修改加载的 swf,您可以在加载程序 swf 中覆盖其主要 class 定义。如果加载的 swf 的 Main class 包含重要的 and/or 不断变化的逻辑,这可能会产生不良后果。
- 在你的 loader swf 中定义
Main
class - 在 Main 构造函数中使用
ADDED_TO_STAGE
编写适当的操作以正确访问阶段。 - 将此
Main
编译到您的加载器 swf 中:只需在主 swf 代码的某处添加Main;
(这也可以通过 flash builder 中的编译器参数来完成,但何必呢)。
这样您就可以完全替换 Main
的定义。