我正在使用Flash Professional IDE。引用下面的类,如果我将FLA的class属性设置为testingsub1(忽略Main),则代码可以正常工作。但是,如果我将类设置为Main,则代码将在stage.addChild(container);
测试时死于“TypeError:错误#1009:无法访问空对象引用的属性或方法。”。
这违背了我的理解,即舞台是全局的,并且始终可以直接添加显示对象。任何见解和解决方案?
package {
//import com.idtlw.iso.utils.Const;
import flash.display.*;
public class testingsub1 extends testing {
public function testingsub1() {
trace("initializing testing sub 1");
var container:Sprite=new Sprite();
var test1:Sprite=new Sprite();
container.addChild(test1);
}
}
}
package {
import flash.display.*;
public class testing extends Sprite {
public function testing() {
trace("initializing testing");
var container:Sprite=new Sprite();
var test1:testreg1=new testreg1();
container.addChild(test1);
stage.addChild(container);
}
}
}
package
{
import flash.display.*;
public class Main extends Sprite
{
public function Main ()
{
var test1:Sprite=new Sprite();
stage.addChild(test1);
var tester:testingsub1=new testingsub1();
}
}
}
答案 0 :(得分:0)
如果你住在FlashDevelop教程中,你会发现一系列棘手的代码:
if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE,init);
这意味着即使是Main类也不总是可以使用stage。添加此行,创建function init(e:Event=null):void
放置任何需要访问舞台的代码,然后进行设置。
关于你的标题问题 - 没有类在构造函数中有stage
可用设计,即使在设计时将一个对象放置到舞台并且它有一个自定义构造函数,你也无法获得对舞台内的有效引用那个构造函数。 stage
属性仅在将对象添加到已填充对象的显示列表或暂存后才填充。
答案 1 :(得分:0)
正如他在评论中已经提到的原型一样,Stage只是DisplayObjects的一个便利属性,只有当该对象在显示列表中时才可访问。
在您的测试类中,您正在访问它的舞台对象。在将其添加到显示列表之前,它始终为null。在构造函数完成之后才会添加它,因此就是NRE。正确的处理方法是在你的ctor中注册一个事件监听器来监听ADDED_TO_STAGE,然后添加容器。
但我认为你想要的方法并不是一个好主意。 DO通常应该是自包含的,而不是直接通过舞台访问显示列表。将容器添加到测试类(或者只是将类用作容器)更好的做法,让主要将该类添加到显示列表中。