|
|
|||||
Ругается на stage при вызове метода
Здравствуйте.
Написал класс Slider. У него есть публичный метод destroy(). Когда вызываю этот метод извне, то ругается на строку , якобы "Не удается вызвать свойство или метод со ссылкой на объект null." Как понимаю, он не видит stage и приходится перед этим проверять его: Объясните пожалуйста почему так происходит? Ведь в методе onKnobMouseUpHandler я так же отписываюсь от события, но ошибок не вылетает... Вот сам класс: public class Slider extends SliderSWC { public var hasEnabled:Boolean; private var _minVal:uint; private var _maxVal:uint; private var _curVal:uint; public function Slider(minVal:uint, maxVal:uint, curVal:uint, titleTxt:String, unitTxt:String) { hasEnabled = true; knob.buttonMode = true; _minVal = minVal; _maxVal = maxVal; _curVal = curVal; updateText(titleTxt, unitTxt); txt.autoSize = TextFieldAutoSize.RIGHT; unit.autoSize = TextFieldAutoSize.LEFT; value.autoSize = TextFieldAutoSize.LEFT; updateTextCurValue(); updatePositionKnob(); knob.addEventListener(MouseEvent.MOUSE_OVER, onKnobMouseOverHandler); knob.addEventListener(MouseEvent.MOUSE_OUT, onKnobMouseOutHandler); knob.addEventListener(MouseEvent.MOUSE_DOWN, onKnobMouseDownHandler); } public function updateText(titleTxt:String, unitTxt:String):void { txt.text = titleTxt.toUpperCase(); unit.text = unitTxt.toUpperCase(); } private function updateTextCurValue():void { value.text = _curVal.toString(); unit.x = value.x + value.width; } private function updatePositionKnob():void { var perc:uint = (_curVal - _minVal) * 100 / (_maxVal - _minVal); knob.x = ((bg.width-2) * perc / 100) + 1 - (knob.width / 2); indicator.width = knob.x + knob.width / 2; } private function onKnobMouseDownHandler(e:MouseEvent):void { if (hasEnabled) { stage.addEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler); stage.addEventListener(MouseEvent.MOUSE_UP, onKnobMouseUpHandler); knob.startDrag(false, new Rectangle(1-knob.width/2, knob.y, bg.width-2, 0)); } } private function onKnobMouseMoveHandler(e:MouseEvent):void { if (hasEnabled) { indicator.width = knob.x + knob.width/2; var perc:uint = (knob.x+knob.width/2) * 100 / (bg.width-2); _curVal = (_maxVal-_minVal) * perc / 100 + _minVal; updateTextCurValue(); dispatchEvent(new Event('VALUE_CHANGED')); } } private function onKnobMouseUpHandler(e:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler); stage.removeEventListener(MouseEvent.MOUSE_UP, onKnobMouseUpHandler); knob.stopDrag(); } private function onKnobMouseOverHandler(e:MouseEvent):void { if (hasEnabled) knob.gotoAndStop('s2'); } private function onKnobMouseOutHandler(e:MouseEvent = null):void { if (hasEnabled) knob.gotoAndStop('s1'); } public function get currentValue():uint { return _curVal; } public function get minValue():uint { return _minVal; } public function get maxValue():uint { return _maxVal; } public function enable():void { knob.alpha = 1; bg.alpha = 1; indicator.alpha = 1; knob.buttonMode = true; hasEnabled = true; } public function disable():void { knob.alpha = 0; bg.alpha = .4; indicator.alpha = .4; knob.buttonMode = false; hasEnabled = false; } public function destroy():void { knob.removeEventListener(MouseEvent.MOUSE_OVER, onKnobMouseOverHandler); knob.removeEventListener(MouseEvent.MOUSE_OUT, onKnobMouseOutHandler); knob.removeEventListener(MouseEvent.MOUSE_DOWN, onKnobMouseDownHandler); stage.removeEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler); stage.removeEventListener(MouseEvent.MOUSE_UP, onKnobMouseUpHandler); } }
__________________
кто не отвечает, того garbage collector забирает |
|
|||||
потому что он уже удален из дисплей листа, когда вызывается destroy() либо удаление происходит в самом методе destroy() до вызова stage.removeEventListener(MouseEvent.MOUSE_MOVE, onKnobMouseMoveHandler);
Самый разумный вариант отписываться и подписываться на события stage, это добавить в конструкторе класса слушатели добавления и удаления со сцены public function Slider(minVal:uint, maxVal:uint, curVal:uint, titleTxt:String, unitTxt:String) { hasEnabled = true; knob.buttonMode = true; _minVal = minVal; _maxVal = maxVal; _curVal = curVal; updateText(titleTxt, unitTxt); txt.autoSize = TextFieldAutoSize.RIGHT; unit.autoSize = TextFieldAutoSize.LEFT; value.autoSize = TextFieldAutoSize.LEFT; updateTextCurValue(); updatePositionKnob(); knob.addEventListener(MouseEvent.MOUSE_OVER, onKnobMouseOverHandler); knob.addEventListener(MouseEvent.MOUSE_OUT, onKnobMouseOutHandler); knob.addEventListener(MouseEvent.MOUSE_DOWN, onKnobMouseDownHandler); addEventListener(Event.ADDED_TO_STAGE, onAdded); addEventListener(Event.REMOVED_FROM_STAGE, onRemoved); } public function onAdded(e:Event):void { // тут добавлять все слушатели сцены } public function onRemoved(e:Event):void { // а тут удалять }
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
caseyryan, спасибо за разъяснение. Вы правы. На свежую голову быстро нашел причину )
Слайдеры у меня находятся внутри _settingsScreen. И _settingsScreen я удалял и дисплей листа до того, как запускал его метод destroy()
__________________
кто не отвечает, того garbage collector забирает |
Часовой пояс GMT +4, время: 17:34. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|