ActionScript 3 Удаление всех прослушивателей событий RESIZE

Я работаю над Flash-проектом, который разделен на отдельные сцены.

В сцене 1 у меня есть несколько MovieClips (которые включают в себя прослушиватели событий для RESIZE (и других) внутри них).

В сцене 2 у меня есть несколько общих и новых клипов MovieClip (которые также включают в себя прослушиватели событий для RESIZE (и других) внутри них).

После нажатия кнопки из Сцены 1 для перехода к Сцене 2 все в порядке, за исключением случаев, когда я изменяю размер сцены, а затем получаю следующую ошибку:

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

Я знаю, что это связано с прослушивателями событий, но было бы нереалистично удалять их по отдельности, поскольку ожидается, что их будет много.


person Kristian Matthews    schedule 02.07.2012    source источник


Ответы (2)


Если я правильно понимаю вашу ситуацию, я думаю, вам, в конце концов, нужно будет удалить каждого слушателя индивидуально или добавить слушателя изменения размера только один раз. Поскольку вы упомянули сцены, могу ли я предположить, что вы работаете над временной шкалой? Я также предполагаю, что ошибка ссылки на нулевой объект исходит из сцены, которая была удалена со сцены, ссылаясь на экранный объект, которого больше нет, ссылку на сцену после удаления сцены или просто вызывает функцию ( обработчик изменения размера) на объекте, который больше не существует.

Вот некоторые способы справиться с этим:

  1. Добавьте некоторую проверку в функциях обработчика слушателя

    если (! this.stage) вернуться

    Чтобы избежать ошибок, но это не поможет, если объект, для которого функция является методом, был удален.

  2. Чтобы избежать необходимости не забывать удалять сотни слушателей, создайте функции removeAllListeners и addCustomEventListener. Вместо обычного addEventListener вызовите addCustomEventListener, который, в свою очередь, вызовет addEventListener. Попросите addCustomListener сохранить цель, функцию прослушивателя и строку события в словаре или массиве объектов. removeAllListeners может перебирать словарь или массив и удалять всех ваших слушателей. Это немного похоже на настройку концентратора событий, но не так уж далеко.

  3. Вместо добавления прослушивателя событий RESIZE к каждой сцене, добавьте его только один раз. Затем в функции слушателя вызовите функцию для любой сцены, которая является активной сценой или представлением. Последний подход, который я видел чаще всего, является наиболее пуленепробиваемым. Это может быть сложно реализовать на временной шкале, я всегда был немного не уверен в области действия переменной временной шкалы.

person smilinfoo    schedule 02.07.2012
comment
Мне самому нравится вариант 2 больше всего, и это то, что я предлагал, но хороший ответ +1 - person shaunhusain; 02.07.2012

Да, насколько мне известно, для этого не существует хорошего автоматизированного способа, однако было бы неплохо создать методы registerAllListeners и removeAllListeners, которые вручную добавляют и удаляют соответствующие слушатели для вашего объекта.

person shaunhusain    schedule 02.07.2012
comment
Не могли бы вы привести пример функций registerAllListeners и removeAllListeners? - person Kristian Matthews; 02.07.2012