0

我正在开发一个 Flash 项目,该项目被分成不同的场景。

在场景 1 中,我有多个 MovieClip(其中包括 RESIZE(和其他)的事件侦听器)。

在场景 2 中,我有一些常见的 MovieClip 和新的(其中还包括 RESIZE(和其他)在其中的事件侦听器)。

单击场景 1 中的按钮转到场景 2 后,一切正常,除非我调整舞台大小,然后出现以下错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.

我知道它与事件侦听器有关,但是单独删除它们是不现实的,因为预计会有很多。

4

2 回答 2

2

如果我正确理解了您的情况,我认为您最终将需要单独删除每个侦听器,或者只添加一次调整大小侦听器。既然你提到了场景,我可以假设你正在处理时间线吗?我还假设空对象引用错误来自已从舞台上删除的场景,引用了一个不再存在的显示对象,场景被删除后对舞台的引用,或者只是调用了一个函数(调整大小处理程序)在不再存在的对象上。

处理这个问题的一些方法是:

  1. 在侦听器处理函数中添加一些检查

    如果 (!this.stage) 返回

    为避免错误,但如果函数作为方法的对象已被删除,则无济于事。

  2. 为了避免需要记住删除数百个侦听器,请创建 removeAllListeners 和 addCustomEventListener 函数。代替通常的 addEventListener,调用 addCustomEventListener,然后调用 addEventListener。让 addCustomListener 将目标、侦听器函数和事件字符串存储在字典或对象数组中。removeAllListeners 可以遍历字典或数组并删除所有侦听器。这有点像建立一个事件中心,但并没有那么远。

  3. 不要将 RESIZE 事件侦听器添加到每个场景,只需添加一次。然后在侦听器函数中调用一个函数,无论哪个场景是活动场景或视图。最后一种是我最常看到的方法,也是最防弹的方法。在时间线上实现可能会很棘手,我一直对时间线变量范围有点模糊。

于 2012-07-02T17:08:52.750 回答
1

是的,据我所知,没有很好的自动化方法可以做到这一点,但是创建一个 registerAllListeners 和一个 removeAllListeners 方法来手动添加和删除适当的侦听器到您的对象是一个好习惯。

于 2012-07-02T16:48:43.107 回答