我正在处理一个Flash项目,该项目被分成不同的场景。
在场景1中,我有多个MovieClip(其中包含RESIZE(和其他)的事件侦听器)。
在场景2中,我有一些常见的MovieClip和新的(其中还包括RESIZE(和其他)内部的事件监听器。)
单击场景1中的按钮转到场景2后,它很好,除非我调整舞台大小然后出现以下错误:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
我知道它与事件监听器有关,但是将它们单独删除是不切实际的,因为它预计会有很多。
答案 0 :(得分:2)
如果我正确地处理了你的情况,我认为你最终需要单独删除每个监听器,或者只添加一次resize监听器。既然你提到了场景,我是否正确地假设你正在制作时间表?我也假设空对象引用错误来自已从舞台中删除的场景,引用不再显示的对象,删除场景后对舞台的引用,或仅调用函数(一个不再存在的对象上的resize handler)。
解决这个问题的一些方法是:
在侦听器处理函数中添加一些检查
if(!this.stage)返回
为避免错误,但如果该对象的功能已被删除,则无效。
为避免需要记住删除数百个侦听器,请创建removeAllListeners和addCustomEventListener函数。而不是通常的addEventListener,调用addCustomEventListener,而addCustomEventListener又调用addEventListener。让addCustomListener将目标,侦听器函数和事件字符串存储在字典或对象数组中。 removeAllListeners可以循环遍历字典或数组并删除所有侦听器。这有点像设置一个事件中心,但不是那么远。
不是将RESIZE事件侦听器添加到每个场景,而是仅添加一次。然后在侦听器函数中调用活动场景或视图中的任何场景的函数。 最后一个是我经常看到的方法,也是最具防弹性的方法。在时间线上实施可能很棘手,我在时间轴变量范围上总是有点朦胧。
答案 1 :(得分:1)
是的,据我所知,没有好的自动化方法,但是创建一个registerAllListeners和一个removeAllListeners方法是一个很好的做法,这些方法可以手动添加和删除对象的相应监听器。