2012-06-14 74 views
1

我有一个程序,我为舞台创建了一个单例类,所以我可以在其他类中访问它。Flash AS3 TLF文本(无法访问空对象引用的属性或方法。)

我有一些其他的文字在其中的符号,所以需要在代码中修改文本。

我的问题是,每当我使用TLF文本,而不是经典文本,我的任何类的引用的单台班获得“TypeError: Error #1009: Cannot access a property or method of a null object reference."

我以前有过这很好地工作TLF文本程序,但是这是我第一次使用舞台的单身类,所以我的猜测是这涉及到,不知何故。

我已经尝试了一些解决方案,在其他职位我见过的相关问题(如发布设置),但迄今没有已运作

下面是发生第一个错误的地方:

// Constructor 
    public function Zoom(object:MovieClip) { 
     // Set the stage 
     stage = StageManager.instance.stage; 

     // Set the zoom object 
     zoomObject = object;    

     // Add event listener for the mouse wheel 
     stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseZoom); // ERROR OCCURS HERE 

     if (Controls.instance.controls.zoomInBtn && Controls.instance.controls.zoomOutBtn) { 
      Controls.instance.controls.zoomInBtn.addEventListener(MouseEvent.CLICK, zoomIn); 
      Controls.instance.controls.zoomOutBtn.addEventListener(MouseEvent.CLICK, zoomOut); 
     } 
    } 

这里是单例类:

package { 
import flash.display.Stage; 

// Singleton class so any other classes can access the stage. 
public class StageManager { 

    // Publicly accessible singleton instance 
    public static var instance:StageManager = new StageManager(); 

    private var m_stage:Stage; 

    // Getters and Setters 
    public function set stage(stg:Stage):void { 
     m_stage = stg; 
    } 

    public function get stage():Stage { 
     return m_stage; 
    } 
} 
} 
+0

这将有助于分享(代码的相关部分)。 – poepje

+0

我添加了代码,但我不确定它是否真的有帮助。 – Sean

+0

我没有看到任何与文本相关的代码?如果TLF文本是问题,那就是我们想看到的。附:你有没有调试过,以确保问题真的发生在函数的调用? – poepje

回答

0

首先,真的是不正确的使用API​​方法/属性的名称为自己的类的属性/方法名。它造成混乱。

其次,如果它抛出空错误,则试图访问属性为null的对象(阶段)现在可能有很多原因,例如,这行代码在设置stage属性之前被调用,或者更简单的舞台不能被分配到舞台(现在你得到了为什么我已经说过为自己的类道具使用相同的名称?)再次,它可能是你的代码在DisplayObject的stage属性可用之前执行(内容不会添加到舞台上),并且类不会检查它是否为空。

你所显示的代码样本只是写得很差,即使是“单身”类也是不合适的单身类。

现在的解决方案:

  • 检查代码,设计和改变它了解设计模式(至少对于一个单身)
  • 扫出的StyleManager阶段值,所以你可以看到,如果当属性设置,也在放大构造
  • 总是使用try catch块或至少测试对象的所有脑干你的代码依赖于

如下描绘出:

if(stage) 
{ 
    stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseZoom); 
} 
else 
{ 
    trace("[!] Expected stage but got null"); 
} 

try 
{ 
    stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseZoom); 
} 
catch(err:*) 
{ 
    trace("[!] Expected stage but got null\n"+err); 
} 
  • 绝不要用你自己的类所使用的ActionScript API相同的名称,以避免混淆,使调试更容易:)
  • 如果你依赖于舞台道具不能为null请使用以下代码片段:

这与FlashDevelop生成的n完全相同EW主类和它工作得很好:

if (stage) init(); 
else addEventListener(Event.ADDED_TO_STAGE, init, false, int.MAX_VALUE, true); 

和初始化处理

protected function init(e:Event = null):void 
{ 
    removeEventListener(Event.ADDED_TO_STAGE, init); 
    //do here whatever is needed when stage proeprty is NOT null 
} 

问候

0

的问题可能是古老的,但我最近也有过类似的问题,这是非常令人困惑,因为我在TLF方面经验不足,但我仍然需要使用可以流入对方的文本字段 - 除非您使用Flash,否则就足够简单。所以我很高兴为此运行CS6。

无论如何,我的解决方案是简单地从我的构造函数中删除事件侦听器,并将它放在第一帧的时间线上;舞台装载和一切正常 - 只有我的自尊受到伤害,因为没有足够深入的理解才能使其正常工作。

我一直认为构造函数首先运行 - 并且从来没有将事件分配给舞台的问题,可能现在我知道的更好,但不是太多。

这可能是因为加载TLF组件会导致加载阶段滞后?舞台肯定是第一位的,事后的一切都是这样吗?疯狂!

相关问题