Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.12.2013, 20:23
BAXTER вне форума Посмотреть профиль Отправить личное сообщение для BAXTER Найти все сообщения от BAXTER
  № 1  
Ответить с цитированием
BAXTER
 
Аватар для BAXTER

Регистрация: Dec 2013
Сообщений: 19
По умолчанию Как удалить слушатели событий

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

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

Знаю что есть dispatchEvent, но как сразу удалить ВСЕ слушатели кнопок, а не только по какой делаешь клик?
Миниатюры
Нажмите на изображение для увеличения
Название: 123.png
Просмотров: 181
Размер:	57.7 Кб
ID:	30254  


Последний раз редактировалось BAXTER; 11.12.2013 в 20:36.
Старый 11.12.2013, 20:44
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 2  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Код AS3:
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);
	}
}

Старый 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.
Старый 11.12.2013, 21:19
BAXTER вне форума Посмотреть профиль Отправить личное сообщение для BAXTER Найти все сообщения от BAXTER
  № 4  
Ответить с цитированием
BAXTER
 
Аватар для BAXTER

Регистрация: Dec 2013
Сообщений: 19
Огромное спасибо! Вроде все просто, буду пробовать.


Последний раз редактировалось BAXTER; 11.12.2013 в 21:43.
Старый 11.12.2013, 22:31
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
BAXTER, не нужно вставлять сюда скриншоты. Копируйте свой код и обрамляйте его тегами AS3. Думаете кому-то хочется перенабирать все это вручную, чтобы исправить у вас какую-то ошибку?

Старый 12.12.2013, 03:26
BAXTER вне форума Посмотреть профиль Отправить личное сообщение для BAXTER Найти все сообщения от BAXTER
  № 6  
Ответить с цитированием
BAXTER
 
Аватар для BAXTER

Регистрация: Dec 2013
Сообщений: 19
no problem. Хотел как лучше

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:07.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 18:07.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.