Flash AS3 TLF Text(无法访问null对象引用的属性或方法。)

时间:2012-06-14 12:50:16

标签: actionscript-3 flash 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;
    }
}
}

2 个答案:

答案 0 :(得分:0)

首先,对自己类的属性/方法名称使用API​​方法/属性名称实际上是不正确的。这令人困惑。

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

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

现在的解决方案:

  • 检查您的代码设计,并将其更改为有关设计模式的内容(至少对于单身人士而言)
  • 在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使用的相同名称,以避免混淆并使调试更容易:)
  • 如果您依赖stage属性不为null,请使用以下代码段:

这与FlashDevelop生成新的Main类完全相同,而且效果非常好:

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

和init处理程序

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

最好的问候

答案 1 :(得分:0)

这个问题可能很古老,但最近我遇到了类似的问题,由于我对TLF缺乏经验而感到非常困惑,但是我仍然不赞成使用,但我仍然需要使用可以相互流入的文本字段 - 除非你使用Flash,否则很简单。所以我很高兴与CS6合作。

无论如何,我的解决方案只是从构造函数中删除事件监听器并将其放在第一帧的时间轴中;舞台装载,一切正常 - 只有我的骄傲因为不能深入理解而使其正常工作。

我一直认为构造函数首先运行 - 并且之前从未有过将事件分配给舞台的问题,也许现在我知道的更好,但不是很多。

这可能是因为加载TLF组件会导致加载阶段的延迟吗?当然,舞台是第一位的,之后的一切都是它的孩子吗?疯狂!