PDA

Просмотр полной версии : Как удалить слушатели событий


BAXTER
11.12.2013, 20:23
Нужна помощь. Есть несколько кнопок класса MainButton созданные циклом.
В классе MainButton к каждой кнопке крепится слушатель.

Как мне удалить слушатели всех этих кнопок, после клика на любую кнопку?

Знаю что есть dispatchEvent, но как сразу удалить ВСЕ слушатели кнопок, а не только по какой делаешь клик?

Dip52
11.12.2013, 20:44
var buttons:Array = []; //Массив кнопок:
private function removeAllButtons():void
{
const LENGTHBUTTONS:int = buttons.length;
for(var i:int = 0; i < LENGTHBUTTONS; i++)
{
const BUTTON:MovieClip = buttons[i];
BUTTON.removeEventListener(MouseEvent.CLICK,onCLICK);
}
}

KumoKairo
11.12.2013, 21:02
Dip52, ваш код будет пытаться отписывать несуществующий слушатель. Слушателей вы удаляете в родителе, поэтому функция с названием onCLICK будет искаться в самом родителе, а не в кнопке. А нужно отписывать тот метод, который действительно подписан, то есть BUTTON.onCLICK. Но onClick - приватный метод, к нему нет доступа из родителя.

Знаю что есть dispatchEvent
dispatchEvent - это диспетчеризация события, а не удаление слушателя.

Короче, я предлагаю сделать так

У вас в коде один существенный недстаток - каждая кнопка хранит в себе логику обработки нажатий других кнопок. Это, во-первых, здорово запутывает, а во-вторых усложняет работу с бОльшим количеством кнопок (для каждой новой кнопки придется лезть в класс и добавлять еще один case.
Добавлять событие нажатия на кнопку тоже лучше в родителе, который эти кнопки на себя вешает (на экран).

Я бы советовал пересмотреть общую структуру кода и сделать так:

Класс кнопки вообще убирайте, использовать будем только SimpleButton

var buttonsArray:Array = new Array();
var listenersArray:Array = [button1Listener, button2Listener]; //Массив со слушателями, допустим что у нас 2 кнопки
//Тут ваш позишн еррей

for(var i:int = 0; i < positionArray.length; i++)
{
var button:SimpleButton = new SimpleButton();
//выставляем позишн, добавляем на экран и тд, а потом:
button.addEventListener(MouseEvent.CLICK, listenersArray[i]);
buttonsArray.push(button);
}

function button1Listener(e:MouseEvent):void
{
//код
removeAllListeners();
}

function button2Listener(e:MouseEvent):void
{
//код
removeAllListeners();
}

function removeAllListeners():void
{
for(var i:int = 0; i < listenersArray.length; i++)
{
buttonsArray[i].removeEventListener(MouseEvent.CLICK, listenersArray[i]);
}
}

Можно так же повесить два слушателя на кнопку, один для обработки нажатия, а второй для отписывания от события:

...
for(var i:int = 0; i < positionArray.length; i++)
{
var button:SimpleButton = new SimpleButton();
//выставляем позишн, добавляем на экран и тд, а потом:
button.addEventListener(MouseEvent.CLICK, listenersArray[i]);
button.addEventListener(MouseEvent.CLICK, removeAllListeners);
buttonsArray.push(button);
}

function button1Listener(e:MouseEvent):void
{
//код
}

function button2Listener(e:MouseEvent):void
{
//код
}

function removeAllListeners(e:MouseEvent = null):void
{
for(var i:int = 0; i < listenersArray.length; i++)
{
buttonsArray[i].removeEventListener(MouseEvent.CLICK, listenersArray[i]);
}
}


И совет - не пишите все таки в кадрах..

BAXTER
11.12.2013, 21:19
Огромное спасибо! Вроде все просто, буду пробовать.

caseyryan
11.12.2013, 22:31
BAXTER, не нужно вставлять сюда скриншоты. Копируйте свой код и обрамляйте его тегами AS3. Думаете кому-то хочется перенабирать все это вручную, чтобы исправить у вас какую-то ошибку?

BAXTER
12.12.2013, 03:26
no problem. Хотел как лучше