我有三个类Main(文档类),Container和Area控件。
主类代码
package
{
import flash.display.Sprite;
import flash.events.Event;
import com.andreanaya.areacontrol.Container;
public class Main extends Container
{
private var _build : Build;
public function Main():void
{
super();
if (stage) stageHandler();
else addEventListener(Event.ADDED_TO_STAGE, stageHandler);
}
private function stageHandler(e:Event = null):void
{
trace("entry point");
removeEventListener(Event.ADDED_TO_STAGE, stageHandler);
// entry point
}
}
容器类代码
package com.andreanaya.areacontrol
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.display.DisplayObject;
import flash.system.ApplicationDomain;
public class Container extends Sprite
{
public function Container() {
super();
}
override public function get stage() : Stage {
trace("$$");
return AreaControl.stage;
}
}
}
区域控制类代码
package com.andreanaya.areacontrol
{
import flash.display.Sprite;
import flash.display.Stage;
public class AreaControl extends Sprite
{
public function AreaControl() {
super();
if(_instance)
{
throw new Error("AreaControl is already instantiated.");
}
else
{
_instance = this;
_stage = stage;
return;
}
}
private static var _instance:AreaControl;
private static var _stage:Stage;
static function get stage() : Stage {
return _stage;
}
}
}
我无法从这些课程中访问舞台,任何人都可以帮助我吗?
答案 0 :(得分:0)
为什么需要一个静态变量来存储阶段?它已存储在所有DisplayObject中,并且可由 stage 属性访问。
无论如何,您的问题是您没有将AreaControl对象添加到显示列表中,因此它的 stage 属性将始终为 null
只有在Event.ADDED_TO_STAGE被触发后,这里的良好做法才会访问您的舞台。就像你的主课一样。
我建议您查看您的应用程序架构,因为很少需要在任何地方存储到舞台的全局链接,但如果您确实需要它 - 您可以在 stageHandler中的Main类中分配它。并且您不需要 AreaControl 的实例来分配阶段链接。你可以这样做:
package com.andreanaya.areacontrol {
import flash.display.Sprite;
import flash.display.Stage;
public class AreaControl { //You don't even need to extend it from Sprite
public static var stage: Stage;
}
}
.......
private function stageHandler(e:Event = null):void
{
trace("entry point");
removeEventListener(Event.ADDED_TO_STAGE, stageHandler);
// entry point
// It's not an accident it is called "entry point", you should
// add your code AFTER this line if you don't want any *stage* issues
AreaControl = stage; //It's never null here;
}
启动 stageHandler 功能后,您可以使用 AreaControl.stage
访问您的舞台有很多方法可以处理静态变量和单例,请考虑阅读更多相关内容。我向你展示的方式远非最佳