Показать сообщение отдельно
Старый 11.12.2013, 21:02
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 3  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Dip52, ваш код будет пытаться отписывать несуществующий слушатель. Слушателей вы удаляете в родителе, поэтому функция с названием onCLICK будет искаться в самом родителе, а не в кнопке. А нужно отписывать тот метод, который действительно подписан, то есть BUTTON.onCLICK. Но onClick - приватный метод, к нему нет доступа из родителя.

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

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

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

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

Класс кнопки вообще убирайте, использовать будем только SimpleButton
Код AS3:
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]);
    }
}
Можно так же повесить два слушателя на кнопку, один для обработки нажатия, а второй для отписывания от события:
Код AS3:
...
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]);
    }
}
И совет - не пишите все таки в кадрах..


Последний раз редактировалось KumoKairo; 11.12.2013 в 21:46.