Нулевая ссылка на объект в ScrollPane/endDrag(), когда scrollDrag=true
В моем приложении Flash у меня есть несколько окон, которые используют Scrollpanes. Для свойства scrollDrag установлено значение true, потому что я хочу эту функциональность. Если я закрою (в своем приложении) одно из этих "окон" и открою другое, мне кажется, что в моих журналах появляется много этой ошибки:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at fl.containers::ScrollPane/endDrag()
Иногда я получаю тысячи из них, что, я предполагаю, вероятно, немного замедляет мое приложение, но в остальном не вызывает проблем. Просматривая код Adobe для scrollpane, endDrag действительно прост:
protected function endDrag(event:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_MOVE, doDrag);
}
Этап var - единственное, что может быть здесь пустым.
Единственное, что я могу сделать, это установить scrollDrag = false до того, как окно в моем приложении закроется, чтобы ничто не прослушивало событие. Любые другие предложения?
4 ответа
Я попытался воссоздать ваш сценарий, поэтому у меня был фиктивный клип, который нужно загрузить с помощью ScrollPane, и ScrollPane, содержащий в себе MovieClip со связью (Export for Actionscript), чтобы я мог создать несколько экземпляров. Также в этом клипе слой над компонентом ScrollPane я поместил кнопку закрытия.
Моя первая попытка состояла в том, чтобы отладить fla и посмотреть, где именно он потерпит неудачу. Мне не удалось узнать что-нибудь, что это было, поскольку я продолжал получать это:
Cannot display source code at this location.
Затем я следовал вашим инструкциям и нашел функцию endDrag(). Я изменил это на это:
protected function endDrag(event:MouseEvent):void {
if(stage) stage.removeEventListener(MouseEvent.MOUSE_MOVE, doDrag);
}
И попробовал это. Это не сработало в первый раз, как если бы оно не было скомпилировано. Я попытался отредактировать класс в Flash IDE и увидел, в чем заключалась эта небольшая оговорка. Вот что я имею в виду:
Поэтому я скопировал ScrollPane.as из папки Flash CS4 в./fl/containers/ScrollPane (в основном относительно.fla). Этот файл.as был скомпилирован, и ошибка исчезла.
Короткая версия: да! Вы нашли проблемное место:) Добавьте if, чтобы проверить наличие нулевого объекта в качестве быстрого исправления, и не забудьте сохранить ScrollPane.as относительно файла.fla или в вашем classpath перед повторной компиляцией.
HTH, Джордж
На всякий случай, если кто-то все еще ищет решение, для меня сработало создание подкласса класса ScollPane и переопределение функции endDrag.
package {
import fl.containers.*;
import flash.events.*;
public class ScrollPain extends ScrollPane {
protected override function endDrag(event:MouseEvent):void {
if (stage) {
stage.removeEventListener(MouseEvent.MOUSE_MOVE, doDrag);
}
}
}
}
Полный кредит на Dawsonk на форумах FlashKit для этого. Ссылка на тему FlashKit.
У меня та же проблема при использовании scrollpane с scrollDrag=true. Мое решение для моей проблемы состоит в том, чтобы установить scrollDrag = false
, каждый раз, когда я удаляю полосу прокрутки из отображения (при смене кадра и т. д.)
Надеюсь, поможет...
Решение localhost работает для меня, так что спасибо. Однако я несколько часов бился головой о стену, пока не понял, что забыл изменить все ссылки на код на класс ScrollPane, чтобы вместо этого ссылаться на класс ScrollPain.
Вот пример: я все еще получал ошибку, даже после изменения класса моего компонента ScrollPane в моей библиотеке. Затем я понял, что в классах, которые создают экземпляр ScrollPane, мне нужно было изменить экземпляр с
var scrollPane:ScrollPane = new ScrollPane();
сказать:
var scrollPane:ScrollPain = new ScrollPain ();
Кроме того, мне нужно было изменить свой оператор импорта с
import fl.components.ScrollPane;
сказать:
import com.mysite.ScrollPain;
Я понимаю, что это ошибка новичка.:)